Zum Inhalt springen

JAVA XML Parsing XPath/JDOM


Empfohlene Beiträge

Geschrieben

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

Geschrieben
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

Geschrieben

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.

Geschrieben
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 ;-)

Geschrieben
[...]

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?

Geschrieben
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.

Geschrieben

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)

Geschrieben
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);


        }



        }

Geschrieben

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)

Geschrieben

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.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...