# XML schaffe es nicht Nodes auszulesen



## akchill (19. Nov 2010)

Hallo zusammen,

ich verzweifel ich habe folgende XML Datei:

[xml]<Order>
	<order xmlns="shop.enfinity/order-1.0" refid="12">
		<items>
			<item refid="12">
				<item-ref-id>12</item-ref-id>
				<refid>84</refid>
				<product-name>hemd</product-name>
				<sku>??</sku>
				<tity>1</tity>
				<unit-price>
					<money currency="EUR">8.9</money>
				</unit-price>
				<net-price>
					<money currency="EUR">8.9</money>
				</net-price>
				<tax>
					<money currency="EUR">0</money>
				</tax>
				<hemd>
					<stoff>
						<name>azur</name>
						<artikelnummer>5</artikelnummer>
					</stoff>
					<modell>
						<kragen>kent</kragen>
						<form>Slim</form>
						<allaenge>Normal</allaenge>
						<tasche>Knopf</tasche>
						<manschette>2 Knopf</manschette>
					</modell>
					<extras>
						<monogram>
							<text>C</text>
							<positionierungen>
								<!-- 0 .. n -->
								<position>Tasche</position>
							</positionierungen>
						</monogram>
						<ausstattung>
							<!-- 0 .. n -->
							<extra>Perlmuttknöpfe</extra>
							<extra>Weißer Kragen / weiße Manschetten</extra>
						</ausstattung>
					</extras>
					<vermessung>
						<typ>Hemd</typ> <!-- Hemd / Körper / Standard-->
						<kragenmass>20,5</kragenmass>
						<brustmass>20,5</brustmass>
						<bauchmass>20,5</bauchmass>
						<schultermass>20,5</schultermass>
						<aermelmass>20,5</aermelmass>
						<hemdmass>20,5</hemdmass>
					</vermessung>
				</hemd>
			</item>
		</items>
	</order>
</ExportedOrders>[/xml]


so Jetzt schaffe ich es auf diesen Node zuzugreifen mit folgender scheiß Logik(syr für das Wort)


```
File file = new File("export.xml");
  
  DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  DocumentBuilder db = dbf.newDocumentBuilder();
  Document doc = db.parse(file);
  doc.getDocumentElement().normalize();
  System.out.println("Root element " + doc.getDocumentElement().getNodeName());
  NodeList list = doc.getDocumentElement().getChildNodes();
  NodeList list2 = list.item(1).getChildNodes();
  NodeList list3 = list2.item(1).getChildNodes();
  NodeList list4 = list3.item(1).getChildNodes();
  System.out.println(list4.getLength());
  System.out.println(list4.item(12));
```


Leider kommt bei mir folgende Ausgabe : 

Root element ExportedOrders
19 (länge der Childnode)

aber wenn ich eins von den auslesen will kommt sowas 


```
[#text: 
				]

oder sowas 

[item-ref-id: null]
```


Also ich komm schon irgendwie auf die Nodes aber ich schaff es nicht sie richtig auszulesen, wenn ihr anmerkungen habt immer her damit

Liebe Grüße und schönes WE!


----------



## Noctarius (19. Nov 2010)

Generell kommen immer ein oder mehrere Text-Nodes. Diese haben auch den NodeType = Text. Diese kannst du einfach überspringen und den nächsten Node nehmen.

Kannst dir aber mal Lycia (siehe Sig) ansehen, falls du nur einen Teil der Werte braucht reicht das vllt.


----------



## z-mon (19. Nov 2010)

Hallo akchill,

bitte schau dir das Java und XML Tutorial an. Ich denke in diesem recht ausführlichen Tutorial werden all deine Fragen beantwortet.

Grüße


----------



## akchill (22. Nov 2010)

Also habe jetzt auch mal eine DTD Datei angelegt.

[XML]<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT ExportedOrders (order*)>
<!ELEMENT order (product-line-items*)>
<!ATTLIST order
   xmlns CDATA #REQUIRED
   refid CDATA #REQUIRED
>
<!ELEMENT product-line-items (product-line-item+)>
<!ATTLIST product-line-item
   refid CDATA #REQUIRED
>
<!ELEMENT product-line-item (origin-line-item-ref-id, product-refid, product-name, product-sku, quantity, unit-price*, net-price*, tax*, masshemd*)>
<!ELEMENT unit-price (money)>
<!ELEMENT net-price (money)>
<!ELEMENT tax (money)>
<!ELEMENT masshemd (stoff*, modell*, extras*, vermessung*)>
<!ELEMENT stoff (name, artikelnummer)>
<!ELEMENT modell (kragen, rumpfform, aermellaenge, brusttasche, manschette)>
<!ELEMENT extras (monogram*, ausstattung*)>
<!ELEMENT vermessung (typ, kragenmass, brustmass, bauchmass, schultermass, aermelmass, hemdmass)>
<!ELEMENT monogram (text, positionierungen*)>
<!ELEMENT ausstattung (extra+)>
<!ELEMENT positionierungen (position)>
[/XML]

Meine XML sieht so aus

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE literature SYSTEM "Masshemd.dtd">
<ExportedOrders>
	<order xmlns="intershop.enfinity/order-1.0" refid="12709491308174688">
		<product-line-items>
			<product-line-item refid="1142">
				<origin-line-item-ref-id>16284808</origin-line-item-ref-id>
				<product-refid>3067984</product-refid>
				<product-name>hemd</product-name>
				<product-sku>??</product-sku>
				<quantity>1</quantity>
				<unit-price>
					<money currency="EUR">9.9</money>
				</unit-price>
				<net-price>
					<money currency="EUR">9.9</money>
				</net-price>
				<tax>
					<money currency="EUR">0</money>
				</tax>
				<masshemd>
					<stoff>
						<name>Uni Popeline / Uni / azur</name>
						<artikelnummer>0835</artikelnummer>
					</stoff>
					<modell>
						<kragen>kent</kragen>
						<rumpfform>Slim</rumpfform>
						<aermellaenge>Normal</aermellaenge>
						<brusttasche>Mit Tasche und Knopf</brusttasche>
						<manschette>2 Knopf</manschette>
					</modell>
					<extras>
						<monogram>
							<text>AB</text>
							<positionierungen>
								<!-- 0 .. n -->
								<position>Auf der Tasche</position>
							</positionierungen>
						</monogram>
						<ausstattung>
							<!-- 0 .. n -->
							<extra>Perlmuttknöpfe</extra>
							<extra>Weißer Kragen / weiße Manschetten</extra>
						</ausstattung>
					</extras>
					<vermessung>
						<typ>Hemd</typ> <!-- Hemd / Körper / Standard-->
						<kragenmass>20,5</kragenmass>
						<brustmass>20,5</brustmass>
						<bauchmass>20,5</bauchmass>
						<schultermass>20,5</schultermass>
						<aermelmass>20,5</aermelmass>
						<hemdmass>20,5</hemdmass>
					</vermessung>
				</masshemd>
			</product-line-item>
		</product-line-items>
	</order>
</ExportedOrders>
[/XML]

könnt ihr mal schauen ob dies so richtig ist? Bitte...

Wenn ich folgendes dann ausführe:

z.b. 

System.out.println(doc.getDocumentElement().getElementsByTagName("position").item(0)); 

kommt das raus :

[position: null]

aber das ist doch nicht richtig... ich verstehe es nicht... 

liebe grüße!


----------



## Noctarius (22. Nov 2010)

Steht doch oben. Das erste Child ist ein #TEXT-Node. Je nach VM-Typ können es auch mehrere sein. Z.B. bei der IBM-JVM. Dir bleibt keine andere Wahl, als alle Childs durchzugehen.


----------



## slawaweis (22. Nov 2010)

akchill hat gesagt.:


> Also ich komm schon irgendwie auf die Nodes aber ich schaff es nicht sie richtig auszulesen, wenn ihr anmerkungen habt immer her damit


versuche es mit XPath:


```
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList nl = (NodeList)xpath.evaluate("//position/text()", document, XPathConstants.NODESET);
```

So muss eine Liste von Textknoten herauskommen, für jeden "position" Knoten.

Slawa


----------

