# XML nur ein Element einlesen



## Lybrial (29. Jul 2014)

Hallo,

ich habe viele verschiedene xml-dateien die aber alle ein element gemeinsam haben.
Beispiel:

[XML]
<foo>
    <beschreibung></beschreibung>
    <datum></datum>
    <link></link>
    <item>
        <beschreibung></beschreibung>
        <text></text> // DAS HIER BRAUCH ICH
    </item>
</foo>
[/XML]

Das Element <text> findet sich in jeder einzelnen xml datei, unabhängig davon, wie 
sie sonst aufgebaut ist.

Wie kann ich dieses eine <text> Element mit einem SAX-Parser auslesen?


----------



## dzim (29. Jul 2014)

Indem du den Baum von Elemente entlang läufst, bis du beim <text>-Element angekommen bist?
Wenn dir der Rest der Daten in der XML jeweils egal ist, kannst du es aber vielleicht auch einfacher via Regular Expression extrahieren.


----------



## Lybrial (29. Jul 2014)

Thx:


```
public class SaxReader {
	private SaxHandler saxHandler = null;
	
	public SaxReader() {
		this.saxHandler = new SaxHandler();
	}
	
	public List<String> readXML() throws ParserConfigurationException, SAXException, FileNotFoundException, IOException {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser saxParser = factory.newSAXParser();
		saxParser.parse(new FileInputStream("myXml.xml"), this.saxHandler);
		
		return this.saxHandler.getExtractedTextList();
    }
	
    public static void main(String[] args) throws FileNotFoundException, ParserConfigurationException, SAXException, IOException {
    	SaxReader reader = new SaxReader();
    	List<String> textList = reader.readXML();

    	for(String text : textList) {
            System.out.println(text);
        }
    }
}

public class SaxHandler extends DefaultHandler {

	private List<String> extractedTexts = new ArrayList<String>();

	private CharArrayWriter extractedText = null;

	@Override
	public void startElement(String uir, String localName, String qName, Attributes attributes) throws SAXException {
		this.extractedText = new CharArrayWriter();
	}
	
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		if(qName.equalsIgnoreCase("text")) {
			this.extractedTexts.add(this.extractedText.toString().trim());
		}
	}
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		this.extractedText.write(ch, start, length);
	}
	
    public List<String> getExtractedTextList() {
    	return extractedTexts;
    }
}
```


----------

