Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[Java/XPath] Xpath expressie op een node

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een xml document waar ik op een bepaald punt dit heb:

code:
1
2
3
4
5
6
7
8
9
10
11
12
    <authors>
      <author>
        <firstname>Raphael</firstname>
        <lastname>sonic</lastname>
        <code>US1</code>
      </author>
      <author>
        <firstname>Jelle</firstname>
        <lastname>Victoor</lastname>
        <code>US1</code>
      </author>
    </authors>


Ik haal dus de authors node op via een xpath query. hierna overloop ik die node op deze manier:
Java:
1
2
3
4
5
6
7
                for (int i = 0; i < authorsNode.getChildNodes().getLength(); i++) 
                {
                // Check for the author tag
                    if(authorsNode.getChildNodes().item(i).getNodeType() == Document.ELEMENT_NODE) {
Node authorNode = authorsNode.getChildNodes().item(i);
}
}

Nu wil ik op die authorNode nog een xpath query uitvoeren om de firstname en de lastname op te halen, (/author/firstname) maar als ik deze node wil gebruiken krijg ik een NullPointerException.
Is het mogelijk om een xpath op een node uit te voeren of bekijk ik het vanuit de verkeerde hoek?

  • bat266
  • Registratie: Februari 2004
  • Laatst online: 17-11 16:02
Probeer eens om de getTextContent() aan te roepen ipv het huidige (heb even niet de mogelijkheid om te kijken of hetexact de juiste naam is)

Better to remain silent and be thought a fool then to speak out and remove all doubt.


Verwijderd

Topicstarter
bat266 schreef op vrijdag 18 april 2008 @ 12:53:
Probeer eens om de getTextContent() aan te roepen ipv het huidige (heb even niet de mogelijkheid om te kijken of hetexact de juiste naam is)
bedoel je van de node? ik krijg een nullpointer bij het aanspreken van het node object, dus kan ik daar niets aan opvragen, of begrijp ik verkeerd wat je wil zeggen?

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Volgens mij komt dit omdat je authorNode binnen de context van je if block definieert. Of voer je daar ook de XPath query uit?
Kun je anders eens de code tot aan het moment van aanspreken van authorNode geven?

[ Voor 25% gewijzigd door bigbeng op 18-04-2008 13:10 ]


Verwijderd

Topicstarter
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Authors ---------------------------------------------//
ArrayList<Person> authors = new ArrayList<Person>();
Node authorsNode = (Node)xpath.evaluate(XPQAUTHORS, xdoc, XPathConstants.NODE);
for (int i = 0; i < authorsNode.getChildNodes().getLength(); i++)
{
// Check for the author tag
  if(authorsNode.getChildNodes().item(i).getNodeType() == Document.ELEMENT_NODE) {
      //use the author tag to perform 2 xpath queries
      Node authorNode = authorsNode.getChildNodes().item(i);
// Wat testen
      Node t = (Node) xpath.evaluate("/author/firstname", authorNode.getParentNode(), XPathConstants.NODE);
      System.out.println("[DEBUG] " + t.getNodeName());
      System.out.println("[DEBUG] " + t.getNodeValue());
      System.out.println("[DEBUG] " + t.getNodeType());
      System.out.println(xpath.evaluate(XPQAUTHORSLASTNAME, authorNode));
//
      Person p = new Person();
      p.setFirstname(xpath.evaluate(XPQAUTHORSFIRSTNAME, authorNode));
      p.setLastname(xpath.evaluate(XPQAUTHORSLASTNAME, authorNode));
      authors.add(p);
  }
}
article.setAuthors(authors);

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
En op regel 11 knalt ie neem ik aan? Met de debugger al gekeken en wat watches aangezet?

Verwijderd

Topicstarter
nope op regel 12, die xpath doet een return van null.
maar op regel 11 gaat het mis, maar je kan niet in je query gaan debuggen hé.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Niet? Slecht hoor ;)

Ik vermoed dat het misschien iets met je xpath query te maken heeft. Haal die eerste slash eens weg, wat gebeurt er dan?

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 14:31
't Is inderdaad die slash waar je mee begint. Daarmee geef je (net als op een unix file system) de root van je hierarchie aan.

Verwijderd

Topicstarter
hmm, dit werkt inderdaad. Ik snap wel niet 100% waarom. Je node heeft toch als root element author, ik dacht dit aan te duiden door een /ervoor te plaatsen, maar blijkbaar is een node iets complexer dan dat, want als ik debug zie ik het volledige xml document er nog in voorkomen.
Nu werkt het en ik denk te snappen waarom. Bedankt!

Verwijderd

Topicstarter
Wanneer ik dit nu test in een loop
Java:
1
2
3
4
5
6
7
8
9
10
11
12
                for (int i = 0; i < authorsNode.getChildNodes().getLength(); i++) {
                    // Check for the author tag
                    System.out.println("[DEBUG] i = " + i);
                    if (authorsNode.getChildNodes().item(i).getNodeType() == Document.ELEMENT_NODE) {
                        //use the author tag to perform 2 xpath queries
                        Node authorNode = authorsNode.getChildNodes().item(i);
                        Person p = new Person();
                        p.setFirstname(xpath.evaluate(XPQAUTHORSFIRSTNAME, authorNode));
                        p.setLastname(xpath.evaluate(XPQAUTHORSLASTNAME, authorNode));
                        authors.add(p);
                    }
                }

dan krijg ik telkens opnieuw de author van de eerste node die ik gebruikte
Java:
1
2
    private final String XPQAUTHORSFIRSTNAME = "//author/firstname/text()";
    private final String XPQAUTHORSLASTNAME = "//author/lastname/text()";

dit komt wss omdat hij telkens de plaats neemt in het doc verbonden aan de node ipv in de node te kijken want ik heb de note even naar mijn log gestuud en die ziet er goed uit

  • bloody
  • Registratie: Juni 1999
  • Nu online

bloody

0.000 KB!!

The - DDD schreef op vrijdag 18 april 2008 @ 13:53:
't Is inderdaad die slash waar je mee begint. Daarmee geef je (net als op een unix file system) de root van je hierarchie aan.
Idd.
Verklaring erachter is als volgt:
Een node die je via xpath verkregen hebt, staat niet op zichzelf (als zijnde root-node), maar heeft ook nog verwijzigingen naar zijn parent inzich.
Deze gebruikt ie dan als je verder gaat zoeken met een start-slash.
Oplossing is om de startslash eraf te halen, OF een thisNode.detach() ofzo te doen.
Met een detach opdracht wordt als het ware de node uit zijn context gehaalt, dus ontdaan van o.a. zijn parent referentie.

nope


Verwijderd

Topicstarter
als ik die / wegdoe krijg ik niets meer, als ik // zet krijg ik telkens dezelfde waardes dus denk ik dat de detach het beste zou zijn (ofwel dit het onmogelijk maakt om dan nog het document opnieuw op te bouwen)
Pagina: 1