# einfach XML lesen



## crsh (26. Sep 2018)

Ich brauche einen möglichst einfachen Code mit dem man Daten aus XML-Dateien lesen kann. Ich habe bis jetzt versucht JDom zu benutzen, aber da kommen nur irgendwelche Fehlermeldungen, und außerdem ist mir das zu umständlich. Es muss doch eine einfache und unkomplizierte Möglichkeit geben, Daten zu lesen und in Java-Variablen zu speichern.


----------



## mihe7 (26. Sep 2018)

https://docs.oracle.com/javase/tutorial/jaxp/index.html
https://www.baeldung.com/java-xpath


----------



## Darano (27. Sep 2018)

Ja. XMLPullParserFactory und XMLPullParser sind sehr empfehlenswert. Total eas anzuwenden. Die API ist bei Android sogar im standard package.

http://www.xmlpull.org/v1/doc/api/org/xmlpull/v1/package-summary.html

Beispiel Code wie ich einen RSS-Feed von Apple parse:


Spoiler





```
public boolean parseXML(String xmlData) {
boolean status = true;
boolean inEntry = false;
int eventType;
String tagName = "";
String tagValue = "";
FeedEntry currentRecord = null;
try {
XmlPullParserFactory fac = XmlPullParserFactory.newInstance();
fac.setNamespaceAware(true);
XmlPullParser xpp = fac.newPullParser();
xpp.setInput(new StringReader(xmlData));
eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
tagName = xpp.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if ("entry".equalsIgnoreCase(tagName)) {
inEntry = true;
currentRecord = new FeedEntry();
}
break;
case XmlPullParser.TEXT:
tagValue = xpp.getText();
break;
case XmlPullParser.END_TAG:
if (inEntry) {
if ("title".equalsIgnoreCase(tagName)) {
currentRecord.setTitle(tagValue);
} else if ("summary".equalsIgnoreCase(tagName)) {
currentRecord.setSummary(tagValue);
} else if ("im:price".equalsIgnoreCase(tagName)) {
currentRecord.setIm_price(tagValue);
} else if ("rights".equalsIgnoreCase(tagName)) {
currentRecord.setRights(tagValue);
} else if ("entry".equalsIgnoreCase(tagName)) {
entries.add(currentRecord);
inEntry = false;
}
}
break;
}
eventType = xpp.next();
}
} catch (XmlPullParserException e) {
status = false;
Log.e(TAG, "parseXML: Factory couldnt be instantiated: " + e.getMessage());
} catch (IOException e) {
status = false;
Log.e(TAG, "parseXML: " + e.getMessage());
}
return status;
}
```


----------



## ProChris (21. Okt 2018)

Hallo Crsh,

wenn es sich um kleinere XML Strukturen handelt, dann verwende ich gerne einen SAX Parser. Sobald die XML Strukturen komplexer werden, verwende ich JAXB.

Viele Grüße

ProChris


----------



## Nummer6800 (26. Jul 2019)

Hallo.

Hatte vorher auch keine Ahnung. Doch dank der folgenden Beitraege konnte ich es einfach loesen:
Musste nur ein wenig rumexperementieren:

Der Beitrag von Olivier Boisse








						Get path to all XML's nodes
					

I have an example XML as follows:  <message>   <metadata>      <msg_id>1</msg_id>     <client_type>type1</client_type>   </metadata>   <individual>  ...




					stackoverflow.com
				



und








						Visit all elements in DOM document
					

This is an example of how to visit all elements in a DOM Document. A DOM is a standard tree structure, where each node contains one of the components from




					examples.javacodegeeks.com
				






Notwendige imports:
import javax.xml.xpath.*;
import org.xml.sax.SAXException;
import java.io.FileReader;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

So verwendet man es:

            File file = new File(offlineUrlXbrlUrl);

            // E:/doppelt/test.txt


            XPath xPath =  XPathFactory.newInstance().newXPath();
            String expression = "//*[not(*)]";

            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = builderFactory.newDocumentBuilder();
            Document document = builder.parse(file);
            document.getDocumentElement().normalize();

            NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(document, XPathConstants.NODESET);


            for(int i = 0 ; i < nodeList.getLength(); i++) {

                if(nodeList.item(i).getNodeName().contains("us-gaap") && nodeList.item(i).getTextContent().length() < 15) {

Habe dann hier abgesucht was us-gaap enthaelt.



Gruß

Axel Pfennig, Duesseldorf


----------

