# SAX parsen - Wie?



## doi_project (8. Okt 2011)

Hallo zusammen! 


Ich möchte mein erstes XML Dokument (Link) mit SAX parsen.

Ich habe mir das folgende Tutorial angeschaut und mit den Beispielen angefangen. Es scheint jedoch outdated zu sein, da Eclipse immer wieder Errors ausspuckt.

Kann mir jemand einen Ansatz (Tutorial?) geben, wie ich anfangen soll?


----------



## doi_project (9. Okt 2011)

Ok. Ich habe jetzt ein weiteres Tutorial zu SAX gefunden.

Ich habe jetzt beide Varianten in Eclipse eingegeben, jedoch bekomme ich für beide Fehlermeldungen.



> 1) SAXParser cannot be resolved to a type
> 2) The import com.ibm cannot be resolved



Was soll das?


Dann habe ich noch eine Frage, wie man den Filenamen eingibt.
Im Tutorial steht:

```
parser.parse(file);
```

Kann man anstatt 'file' eine URL eingeben? Wo (welche Directory?) muss sich die XML Datei befinden, damit sie eingelesen werden kann?


----------



## Gast2 (9. Okt 2011)

> SAXParser cannot be resolved to a type


Das bedeutet dass der Import für die Klasse SAXParser fehlt (oder nicht aufgelöst werden kann).



> The import com.ibm cannot be resolved


Das Paket 
	
	
	
	





```
com.ibm
```
 kann nicht gefunden werden. Hast du die jar Datei im buildpath?


----------



## turtle (9. Okt 2011)

Schau mal hier


----------



## doi_project (9. Okt 2011)

turtle hat gesagt.:


> Schau mal hier



Genau das war ich jetzt am Durchgehen.
Das Beispiel war meine Rettung - hat perfekt funktioniert 


Jetzt habe ich es explizit für meine Anwendung benutzt.
Hier, mein XML File:
[XML]
<?xml version="1.0"?>
<OAI-PMH xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
	<responseDate>2011-10-09T11:54:21Z</responseDate>
	<request verb="ListRecords" from="2011-09-14T08:02:38Z" metadataPrefix="oai_dc" set="DOI">http://aleph-prod.ethz.ch/OAI</request>
	<ListRecords>
		<record>
			<header>
				<identifier>oai:eth-bib-pub:EBI01-006080880</identifier>
				<datestamp>2011-09-14T17:57:37Z</datestamp>
				<setSpec>DOI</setSpec>
			</header>
			<metadata>
				<oai_dc:dc xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
					<dc:type>Printed language material</dc:type>
					<dc:language>ger</dc:language>
					<dc:identifier>10.3929/ethz-a-006080880 / doi</dc:identifier>
					<dc:title>Grundlagen für eine differenzierte Bemessung von Verkehrsanlagen</dc:title>
					<dcublisher>Zürich</dcublisher>
					<dcublisher>ETH, Eidgenössische Technische Hochschule Zürich, IVT, Institut für Verkehrsplanung und Transportsysteme</dcublisher>
					<dc:date>2008</dc:date>
					<dc:format>Online-Datei</dc:format>
					<dc:creator>Bernard, Michael</dc:creator>
					<dc:creator>Axhausen, Kay W.</dc:creator>
					<dc:contributor>e-collection 2010</dc:contributor>
					<dc:identifier>http://e-collection.ethbib.ethz.ch/show?type=incoll&nr=1785</dc:identifier>
				</oai_dc:dc>
			</metadata>
		</record>
	</ListRecords>
</OAI-PMH>
[/XML]


Hier der dazugehörige (angepasste Code) - ich möchte nur mal das Root-Element ausgeben lassen:

```
public class LinkParser {
 
    public void getAllUserNames(String fileName) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            File file = new File(fileName);
            if (file.exists()) {
                Document doc = db.parse(file);
                Element docEle = doc.getDocumentElement();
 
                // Print root element of the document
                System.out.println("Root element of the document: "
                        + docEle.getNodeName());
             }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
```


Und schon wieder gibt's 'ne komische Fehlermeldung:


> org.xml.sax.SAXParseException: The reference to entity "nr" must end with the ';' delimiter.



Das bezieht sich auf 'nr' in der URL für 'dc:identifier' drin.
Wie soll ich das wegbringen?


----------



## doi_project (9. Okt 2011)

EikeB hat gesagt.:


> Das Paket
> 
> 
> 
> ...



Wusste nicht, dass ich die .jar einfügen muss. Ich dachte das wäre ein integrierter Import und keine externe Datei.


----------



## doi_project (9. Okt 2011)

doi_project hat gesagt.:


> Und schon wieder gibt's 'ne komische Fehlermeldung:
> 
> 
> Das bezieht sich auf 'nr' in der URL für 'dc:identifier' drin.
> Wie soll ich das wegbringen?




Das bezog sich eigentlich auf das '&' - habe dies manuell jetzt mit einem '&amp;' ersetzt.

Wie kann ich das jetzt in JAVA automatisieren?


----------



## turtle (9. Okt 2011)

<dc:identifier>http://e-collection.ethbib.ethz.ch/show?type=incol*l&amp;*nr=1785</dc:identifier>

I'm late :-(


----------



## turtle (9. Okt 2011)

> Wie kann ich das jetzt in JAVA automatisieren?



Mit einer der vielen Bibliotheken hierfür, z.B. StringEscapeUtils


----------



## doi_project (9. Okt 2011)

turtle hat gesagt.:


> Schau mal hier



Ich versuche jetzt wie im Beispiel mein oben angegebenes Dokument zu parsen.
Ich möchte dabei die Elemente im Tag '<oai_dc:dc>' herauslesen.

Ich habe mal so angefangen (ich gebe die XML-Baumhierarchie Schritt-für-Schritt aus):


```
Document doc = db.parse(file);
 Element docEle = doc.getDocumentElement();
 
 // Print root element of the document
 System.out.println("Root element of the document: " + docEle.getNodeName());
 
 NodeList ListRecords = docEle.getElementsByTagName("ListRecords");

 // Print second element of the document
 System.out.println("Second element of the document: " + ListRecords.item(0).getNodeName());


if (ListRecords != null && ListRecords.getLength() > 0) {
   for (int i = 0; i < ListRecords.getLength(); i++) {
 
        Node record = ListRecords.item(i);                        

        // Print third element of the document
        System.out.println("Third element of the document: " + record.getNodeName());
   }
} else {
   System.exit(1);
}
```

Der Output sieht jetzt folgendermassen aus:


> Root element of the document: OAI-PMH
> Second element of the document: ListRecords
> Third element of the document: ListRecords



Was soll das?
Wieso heisst es zweimal 'ListRecords' und nicht 'Records' beim dritten Mal? ???:L


----------



## doi_project (10. Okt 2011)

turtle hat gesagt.:


> Mit einer der vielen Bibliotheken hierfür, z.B. StringEscapeUtils



Du meinst also die Funktion escapeXml?

Soll ich das XML Dokument zuerst durch diese Proprocessing-Prozedur schicken und erst dann parsen?


----------



## doi_project (10. Okt 2011)

doi_project hat gesagt.:


> Was soll das?
> Wieso heisst es zweimal 'ListRecords' und nicht 'Records' beim dritten Mal? ???:L




Das habe ich jetzt auch alleine hingekriegt.
So sieht der neue Code aus:


```
public void getAllRequiredValues(String fileName) {
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            File file = new File(fileName);
            if (file.exists()) {
                Document doc = db.parse(file);
                Element docEle = doc.getDocumentElement();
 
                // Print root element of the document
                System.out.println("Root element of the document: "
                        + docEle.getNodeName());
 
                NodeList ListRecords = docEle.getElementsByTagName("ListRecords");

                // Print second element of the document
                System.out.println("Second element of the document: "
                        + ListRecords.item(0).getNodeName());
 
                
                if (ListRecords != null && ListRecords.getLength() > 0) {
                    for (int i = 0; i < ListRecords.getLength(); i++) {
 
                        Node node1 = ListRecords.item(i);    
                        Element e1 = (Element) node1;
                        NodeList recordList = e1.getElementsByTagName("record");

                        
                        // Print third element of the document
                        System.out.println("Third element of the document: "
                                + recordList.item(0).getNodeName());
                        
                        
                        if (recordList != null && recordList.getLength() > 0) {
                            for (int j = 0; j < recordList.getLength(); j++) {
         
                                Node node2 = recordList.item(j);    
                                Element e2 = (Element) node2;
                                NodeList metadataList = e2.getElementsByTagName("metadata");

                                // Print fourth element of the document
                                System.out.println("Fourth element of the document: "
                                        + metadataList.item(0).getNodeName());
 
                                Node oai = metadataList.item(0);
                                
		                        if (oai.getNodeType() == Node.ELEMENT_NODE) {
		                             int entry = j+1;   
		                             System.out.println("========= Entry Nr. " + entry + " ============");
		   
		                             Element e3 = (Element) oai;
		   
		                             NodeList dcItemList = e3.getElementsByTagName("dc:identifier");
		                             System.out.println("Identifier: "
		                                      + dcItemList.item(0).getChildNodes().item(0)
		                                              .getNodeValue());

		                             dcItemList = e3.getElementsByTagName("dc:title");
		                             System.out.println("Title: "
		                                      + dcItemList.item(0).getChildNodes().item(0)
		                                              .getNodeValue());
		                             
		                             dcItemList = e3.getElementsByTagName("dc:identifier");
		                             System.out.println("Identifiers: "
		                                      + dcItemList.item(0).getChildNodes().item(0)
		                                              .getNodeValue() + " and "
		                                      + dcItemList.item(1).getChildNodes().item(0)
		                                              .getNodeValue());
		                             
		                             dcItemList = e3.getElementsByTagName("dc:publisher");
		                             System.out.println("Publisher: "
		                                      + dcItemList.item(0).getChildNodes().item(0)
		                                              .getNodeValue());
		                             
		                             dcItemList = e3.getElementsByTagName("dc:date");
		                             System.out.println("Date: "
		                                      + dcItemList.item(0).getChildNodes().item(0)
		                                              .getNodeValue());

		                             System.out.println("=====================");
		                             
		                          }
                                
                            }
                        } else {
                            System.exit(1);
                        }

                        
                        


                                
                    }
                } else {
                    System.exit(1);
                }
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
```


Die Frage ist nach wie vor - wie verarbeite ich die URL im XML-Dokument mit escapeXml?


----------

