Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

JAVA XML Parsing XPath/JDOM

Empfohlene Antworten

Veröffentlicht

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

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

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.

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

[...]

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?

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.

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)

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


        }



        }

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)

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.