# xml Datei parsen ohne End-Tag



## Lenzen (8. Jun 2010)

Ich versuche schon recht lange ein xml Dokument zu parsen in dem das End-Tag fehlt (Weshalb fehlt es? -> es wird zur Laufzeit abgegriffen). Leider schlägt das immer fehl. 

Gibt es eine Möglichkeit dies zu tun?

[Java]
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<breakfast_menu>
	<food>
		<name>Strawberry Belgian Waffles</name>
		<price>$7.95</price>
		<description>light Belgian waffles covered with strawberries and whipped cream</description>
		<calories>900</calories>
	</food>

	<food>
		<name>Berry-Berry Belgian Waffles</name>
		<price>$8.95</price>
		<description>light Belgian waffles covered with an assortment of fresh berries and whipped cream</description>
		<calories>900</calories>
	</food>

<---------------------------------------------------------------hier fehlt das End-Tag
[/code]


```
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class TestEventStaX {
  
  private static void parseXmlFile(){
    
    try{    
    File file = new File("/tmp/TEST.xml");
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setValidating(false);
    DocumentBuilder db = dbf.newDocumentBuilder();
  
   //  FileInputStream fstream = new FileInputStream("/tmp/TEST.xml");    
   //  DataInputStream in = new DataInputStream(fstream);
   //  Document doc = db.parse(in);
    
    Document doc = db.parse(file);
    doc.getDocumentElement().normalize();
    System.out.println("Root element " + doc.getDocumentElement().getNodeName());
    NodeList nodeLst = doc.getElementsByTagName("sample");
    System.out.println("Information of all samples");


    }catch(ParserConfigurationException pce) {
      pce.printStackTrace();
    }catch(SAXException se) {
      se.printStackTrace();
    }catch(IOException ioe) {
      ioe.printStackTrace();
    }
  }

  public static void main(String args[]) {
    parseXmlFile();    
  }
}
```


```
[Fatal Error] TEST.xml:10:1: XML document structures must start and end within the same entity.
org.xml.sax.SAXParseException: XML document structures must start and end within the same entity.
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:249)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
	at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:208)
	at CSV_Reader_Mail.TestEventStaX.parseXmlFile(TestEventStaX.java:30)
	at CSV_Reader_Mail.TestEventStaX.main(TestEventStaX.java:47)
```


----------



## Ebenius (8. Jun 2010)

Also wenn verlässlich immer nur das End-Tag fehlt, dann ist der einfachste Weg der, das End-Tag hinzu zu mogeln. Einfach von einem SequenceInputStream lesen, der als ersten Strom einen FileInputStream auf die Datei hat und als zweiten einen ByteArrayInputStream der nur das End-Tag enthält.

Ebenius


----------



## Noctarius (8. Jun 2010)

Alternativ wenn es als String kommt einfach ans Ende den String anfügen und dann parsen. Falls es nicht immer fehlt einmal testen ob das Endtag im String vorkommt und nur adden, wenn es nicht da ist.


----------



## Ebenius (8. Jun 2010)

Noctarius, in Zeile 28 wird aus einem File gelesen. Daher der Vorschlag mit dem SequenceInputStream…

Ebenius


----------



## Noctarius (8. Jun 2010)

Ebenius hat gesagt.:


> Noctarius, in Zeile 28 wird aus einem File gelesen. Daher der Vorschlag mit dem SequenceInputStream…
> 
> Ebenius



Ja hab ich erst gesehen nach dem schreiben *schäm*


----------



## Lenzen (9. Jun 2010)

Vielen Dank für den Tipp mit dem SequenceInputStream. Wusste nicht das es so was gibt.

Meine Lösung:


```
...
      FileInputStream fstream = new FileInputStream("/tmp/TEST.xml");    
      String endTag = "<breakfast_menu>";
      InputStream is = new ByteArrayInputStream(endTag.getBytes("UTF-8"));
      SequenceInputStream seqinstream = new SequenceInputStream(fstream, is);
      DataInputStream in = new DataInputStream(seqinstream);
      
      Document doc = db.parse(in);
...
```


----------



## Ebenius (9. Jun 2010)

Funktioniert es so? Du müsstest natürlich noch ein [c]/[/c] einfügen, damit ein schließender Tag daraus wird.

Ebenius


----------

