2016-11-26 5 views
-1

Ich muss eine XML-Datei analysieren, die zahlreiche Mengen von Produkten enthält, und ich muss es alle Produkte zurückgeben, die in der XML-Datei gefunden werden.parse xml nicht Radfahren?

Der Code, den ich habe, gibt jedoch nur eins dieser Produkte zurück und berührt die anderen Produkte nicht, obwohl sie in der .xml-Datei enthalten sind.

Hier ist mein Code, kann mir jemand helfen, dies herauszufinden?

public void parse(String fileName) throws SAXException, IOException, XPathExpressionException { 
    File f = new File(fileName); 
    Document doc = builder.parse(f); 

    int prodCount = Integer.parseInt(path.evaluate("count(/inventory/products)", doc)); 

    for (int i = 1; i <= prodCount; i++) { 

     String code = path.evaluate("/inventory/products[" + i + "]/product/code", doc); 
     String description = path.evaluate("/inventory/products[" + i + "]/product/desc", doc); 
     Double price = Double.parseDouble(path.evaluate("/inventory/products[" + i + "]/product/price", doc)); 
     int quantity = Integer.parseInt(path.evaluate("/inventory/products[" + i + "]/product/quantity", doc)); 

     Product p = new Product(code, description, price, quantity); 
     products.add(p); 

    } 

    } 
} 

Danke!

Antwort

1

Zuerst zählen Sie die Anzahl der products Elemente, nicht product Elemente. Dies ist immer 1. Die korrekte Anzahl ist

"count(/inventory/products/product)" 

Sie müssen auch den Index auf das untergeordnete Element, nicht das übergeordnete Element platzieren.

Zum Beispiel

"/inventory/products/product[" + i + "]/code" 

nicht

"/inventory/products[" + i + "]/product/code" 

Sie dies deutlich durch die Arbeit direkt mit den product Knoten vereinfachen kann:

NodeList products = (NodeList) path.evaluate("/inventory/products/product", doc, XPathConstants.NODESET); 

for (int i = 0; i < products.getLength(); i++) { 
    Node product = products.item(i); 
    String code = path.evaluate("code", product); 
    String description = path.evaluate("desc", product); 
    Double price = (Double) path.evaluate("price", product, XPathConstants.NUMBER); 
    Double quantity = (Double) path.evaluate("quantity", product, XPathConstants.NUMBER); 

    Product p = new Product(code, description, price, quantity.intValue()); 
} 
+0

gab mir genau die gleiche Leistung von nur 1 Produkt – johnny

+0

Da wa s ein zusätzliches Problem, das ich nicht entdeckte ("count (/ inventory/products)" sollte "count (/ inventory/products/product)" sein). Ich habe die Antwort bearbeitet und am Ende eine Verbesserung vorgeschlagen. – teppic

+0

funktioniert perfekt! Vielen Dank :) – johnny