JasonLief Geschrieben 15. März 2011 Geschrieben 15. März 2011 Hallo FFI-Comunity Ich habe eine Frage resp. ein Problem. Ich habe ein XML geparst mit JDOM. Beispiel <Dinge> <Info> <Hersteller> Sony </Hersteller> <Erstelldatum> 15.03.1990 </Erstelldatum> </Info> <IT> <Hardware> <HD> <Name> Sony XYZ </Name> <Kapazität> 1 TB </Kapazität> </HD> <HD> <Name> Sony ABC </Name> <Kapazität> 2 TB </Kapazität> </HD> </Hardware> </IT> </Dinge> Nun habe ich alles mit JDOM geparst. Musste HD auslesen Dinge --> IT--> Hardware -->HD Jetzt kann es aber sein, das vor dem TAG <Dinge> noch weitere TAGS sind, die die ganzen den bisherigen block "umrahmen" BSP: <Lager> <Inventar> <Dinge> <Info> <Hersteller> Sony </Hersteller> <Erstelldatum> 15.03.1990 </Erstelldatum> </Info> <IT> <Hardware> <HD> <Name> Sony XYZ </Name> <Kapazität> 1 TB </Kapazität> </HD> <HD> <Name> Sony ABC </Name> <Kapazität> 2 TB </Kapazität> </HD> </Hardware> </IT> </Dinge> </Inventar> </Lager> jetzt sollte ich, egal ob jetzt noch hier im BSP(Lager/Inventar) drumrumsteht, sollte ich den alten Code verwenden können. Also das heisst, die Rohform ist wie im ersten CodeBlock. Diese habe ich schon. Nun kann es aber sein das mal ein anderes Format kommt(CodeBlock2) und mein Parser sollte auch dann funktionieren. Ein Arbeitskollege hat mir gesagt dies sollte mit XPath gehen. Da ich aber alles schon mit JDOM gelöst habe, will ich nicht noch alles umschreiben, da es ca. 1500 Zeilen Code sind... Kann mir jemand helfen oder Tipps geben? Danke Lg Jason "JL" Lief Zitieren
etreu Geschrieben 15. März 2011 Geschrieben 15. März 2011 ... da es ca. 1500 Zeilen Code sind... Kannst du uns den relevanten Teil deines Auszuges zeigen? Allgemein empfehle ich beispielsweise diese Lektüre: Java ist auch eine Insel – 13.6 XML-Dateien mit JDOM verarbeiten Zitieren
JasonLief Geschrieben 15. März 2011 Autor Geschrieben 15. März 2011 Kannst du uns den relevanten Teil deines Auszuges zeigen? Allgemein empfehle ich beispielsweise diese Lektüre: Java ist auch eine Insel – 13.6 XML-Dateien mit JDOM verarbeiten Element reel = paper.getChild("Reel"); Element reelConversion = reel.getChild("ReelConversionCharacteristics"); List<Element> reelInfo = reelConversion.getChildren(); for(Element reelE : reelInfo){ if(reelE.equals("ReelWidth")){ reelWidth = Float.valueOf(reelE.getChild("Value").getText()); } if(reelE.equals("ReelDiameter")){ reelDiameter = Float.valueOf(reelE.getChild("Value").getText()); } if(reelE.equals("ReelLength")){ reelLength = Float.valueOf(reelE.getChild("Value").getText()); } } Mit diesen 1500 Zeilen meine ich einfach, das ich das ganze File schon geparst habe mit JDOM, aber jetzt, da das XML -File ja zu einem Teil nicht gleich aufgebaut ist(am Anfang hats noch unnützliche Infos) das ich nicht alles neu machen müsste mit XPath Zitieren
macrominds Geschrieben 15. März 2011 Geschrieben 15. März 2011 ui.. 1500 Zeilen dafür? Ok. Du kannst mit XPath den relevanten Knoten ("//Dinge") heraussuchen. Danach solltest Du auf diesem Knoten (Element) Deinen alten Parser weiterverwenden können. Zitieren
JasonLief Geschrieben 15. März 2011 Autor Geschrieben 15. März 2011 ui.. 1500 Zeilen dafür? Ok. Du kannst mit XPath den relevanten Knoten ("//Dinge") heraussuchen. Danach solltest Du auf diesem Knoten (Element) Deinen alten Parser weiterverwenden können. Nein nicht für das.... Für ein Anderes File War ja nur ein Beispiel ;-) Zitieren
etreu Geschrieben 15. März 2011 Geschrieben 15. März 2011 [...] Du kannst mit XPath den relevanten Knoten ("//Dinge") heraussuchen. Danach solltest Du auf diesem Knoten (Element) Deinen alten Parser weiterverwenden können. Auch die relavanten Informationen im Posting bemerkt? Zitieren
macrominds Geschrieben 15. März 2011 Geschrieben 15. März 2011 Auch die relavanten Informationen im Posting bemerkt? Hatte die relavanten Informationen noch nicht, als ich meine Antwort geschrieben habe, sehe aber im Moment auch nicht worauf Du hinaus willst. Zitieren
etreu Geschrieben 16. März 2011 Geschrieben 16. März 2011 Analog zu deinem Beispielcode hast du irgendwo eine Schleife, in der du die "Dinge" durchgehst. Mit XPath kannst du die alle Elemente als Liste geben lassen, die "Dinge" als Kindelemente besitzen. Ist die List komplett, dann kannst du sie wie bisher verwenden. (siehe posting von macrominds) Zitieren
JasonLief Geschrieben 18. März 2011 Autor Geschrieben 18. März 2011 Analog zu deinem Beispielcode hast du irgendwo eine Schleife, in der du die "Dinge" durchgehst. Mit XPath kannst du die alle Elemente als Liste geben lassen, die "Dinge" als Kindelemente besitzen. Ist die List komplett, dann kannst du sie wie bisher verwenden. (siehe posting von macrominds) Dies hier gibt mir eine Exception. Warum? :confused: package javaapplication6; import java.io.IOException; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.w3c.dom.*; import org.xml.sax.SAXException; import javax.xml.parsers.*; import javax.xml.xpath.*; import org.jdom.Element; public class XPathExample { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException { DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); domFactory.setNamespaceAware(true); // never forget this! DocumentBuilder builder = domFactory.newDocumentBuilder(); Document doc = builder.parse("D:/Dinge.xml"); XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); XPathExpression expr = xpath.compile("//Dinge"); Object result = expr.evaluate(doc, XPathConstants.NODESET); List<Element> nodes = (List<Element>) result; for(Element e : nodes){ System.out.println("bla"); // for (int i = 0; i < nodes.size(); i++) { // // System.out.println(nodes.get(i).getAttributeValue("DeliveryMessageType")); //Element ele = (Element) nodes.item(i); } } Zitieren
etreu Geschrieben 18. März 2011 Geschrieben 18. März 2011 Stacktrace? Meldung? Codestelle? ClassCastExeption? Zitieren
JasonLief Geschrieben 18. März 2011 Autor Geschrieben 18. März 2011 run: Exception in thread "main" com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 2 of 3-byte UTF-8 sequence. at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684) at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:405) at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742) at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanQName(XMLEntityScanner.java:836) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:221) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2755) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235) at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284) at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:180) at javaapplication6.XPathExample.main(XPathExample.java:23) Java Result: 1 BUILD SUCCESSFUL (total time: 0 seconds) Zitieren
etreu Geschrieben 18. März 2011 Geschrieben 18. März 2011 Die Meldung sollte dir sagen, dass Java UTF verwendet und dein Dokument nicht. Entweder du passt im Code das Encoding für das Dokument an oder änderst direkt das Dokument (wahrscheinlich iso-8859-1(5) oder cp-1252). Nebenbei kannst du versuchen auf die Klassen aus javax.xml zu verzichten, da jdom, was du ja bisher genommen hast, auch XPath bereitstellt. Wahrscheinlich kannst du dir dann sogar das Lösen der Encodingproblematik sparen, da es bisher ja offensichtlich bei dir auch funktioniert hat. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.