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.

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

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

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