[Java/XML] DOM geeft onverwacht #text nodes

Pagina: 1
Acties:

  • Wekko
  • Registratie: Januari 2000
  • Laatst online: 28-11 17:00
Ik gebruik de W3 DOM implementatie die standaard in Java 1.4.2 zit om een XML file uit te lezen. Ik ben geen held met Java, maar deze implementatie is vrij simpel. Nu heb ik de volgende XML die onderdeel uit maakt van een XML bestand:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<production>
   <left>
    <item>
     <name><![CDATA[content]]></name>
    </item>
   </left>
   <right>
    <item>
     <name><![CDATA[content]]></name>
    </item>
    <item>
     <name><![CDATA[content]]></name>
    </item>
    <item>
     <name><![CDATA[content]]></name>
    </item>
   </right>
  </production>

Dit is een representatie voor 'left -> right1 right2 right 3'. Nu begint de java code met getElementsByClassName("production"). Hierbinnen 'loopt' de code over de child elementen, 'left' en 'right'. Als het (getNodeName()) 'left' is dan wordt het eerste kind gepakt. Daarbinnen wordt weer 'geloopt' omdat een item uit name, action en attributes kan bestaan (name is verplicht). Hier wordt weer op gecheckt met getNodeName().

In het geval van het element 'right' gebeurt hetzelfde, alleen loopt ie nog over alle items ipv automatisch het eerste kind pakken. Als ik dit doe dan is de 'item node' alleen ineens een #text node ipv een element. Dit terwijl 'name' er ook nog onder zit. Zowel getNodeValue() als getTextContent() geven een lege string (dus geen null) terug. De parent node outputten geeft wel gewoon 'item'. De XML file valideert ook, dus ik begrijp het niet.

Iemand enig idee hoe een dergelijke fout kan ontstaan? Waar ik vooral op moet letten? Mijn code is iig:
code:
1
2
3
4
5
6
7
8
9
10
11
12
if(leftright.getNodeName().equals("left") && leftright.hasChildNodes()) {
                    //left side
                    Node item = leftright.getChildNodes().item(1); //first item
    (...)//gaat goed
                }
                else if(leftright.getNodeName().equals("right") && leftright.hasChildNodes()) {
                    //right side
                    NodeList rightItems = leftright.getChildNodes(); //all items
                    for(int k=0; k<rightItems.getLength(); k++) {
                        Node item = rightItems.item(k); //==lege #text node ipv '<item>'??
}
}

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

Na <item> staan een enter en een aantal spaties. Oftewel een text node. Daarna komt pas een <name> element. Gewoon een kwestie van de text nodes negeren als je die toch niet wilt hebben.

Hetzelfde geld uiteraard voor elke node waar een enter of spatie achter staat.

[ Voor 6% gewijzigd door Creepy op 22-06-2007 16:35 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Wekko
  • Registratie: Januari 2000
  • Laatst online: 28-11 17:00
Aha ik wist niet dat dat zo nauw luisterde. Het lost idd de problemen op. En daar ben ik dus al 3 uur mee bezig ;). Dank!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Meestal zijn er in parsers wel opties om whitespace textnodes te skippen; dan komen ze ook niet in je DOM terug. Dat houdt je code een beetje cleaner.

Verder bedoel je waarschijnlijk getElementsByTagName i.p.v. getElementsByClassName

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Wekko schreef op vrijdag 22 juni 2007 @ 16:29:
code:
1
2
3
4
if(leftright.getNodeName().equals("left") && leftright.hasChildNodes()) {
                    //left side
                    Node item = leftright.getChildNodes().item(1); //first item
[knip]
"Node item = leftright.getChildNodes().item(1); //first item" - is misschien niet wat je bedoelt,
de index start bij 0 (0 is dus het eerste item), maar misschien is dat gewoon een code/comment/conflictje ;)