# Java XML und Xpath Document speichern



## duennes (28. November 2008)

Hallo Leute,

ich habe ein kleines Objektrepository in einem XML-File gespeichert.

Bei jedem Zugriff auf das Repository muss das File geöffnet werden. 

Allerdings möchte ich nur einmal parsen. Das Lesen des Files funktioniert soweit ganz gut, allerdings kann ich das Dokument nicht speichern, sondern immer nur einen Xpath ausdruck auswerten. Ich möchte aber die Auswertung zu einem beliebigen Zeitpunkt später ausführen und nicht immer die Datei Parsen müssen.
Ergo soll das Dokument gespeichert werden.

Gruß Dennis



```
Set<String> items = new HashSet<String>();
		DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
		domFactory.setNamespaceAware(true); // never forget this!
		DocumentBuilder builder;

		File objects = new File(filelocation);
		try {
			builder = domFactory.newDocumentBuilder();
			Document doc = builder.parse(objects);
			XPathFactory factory = XPathFactory.newInstance();
			XPath xpath = factory.newXPath();
			XPathExpression expr = xpath.compile(normalizedString);

			Object result = expr.evaluate(doc, XPathConstants.NODESET);
			NodeList nodes = (NodeList)result;
			for (int i = 0; i < nodes.getLength(); i++) {
				items.add(nodes.item(i).getNodeValue());
			}
		
		}
```




```
<?xml version="1.0" encoding="iso-8859-1"?>
<labels
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
noNamespaceSchemaLocation="objectFieldsSurfaceMapping.xsd"> 
     <label mandatory="true" type="text" id="Miete zzgl. NK">
     	<name>priceid_2</name>
     	<id>priceid_2</id>
     	<defaultValue>750</defaultValue>
     </label>  
</labels>
```


----------



## CosmoKey (28. November 2008)

Hallo,

wenn du das Dokument, also das Java-Object speichern willst, kannst du einfach die Serialization verwenden.
Siehe hier:
http://java.sun.com/developer/technicalArticles/Programming/serialization/


----------



## duennes (28. November 2008)

Danke für die Antwort, aber dann habe ich mich nicht richtig ausgedrückt.

Bei der Inizialisierung des Programms möchte ich die Datei einmal laden und danach nicht mehr auf die platte greifen müssen. Das problem ist aber, dass ich mit den gefundenen Mittel immer einen Plattenzugriff benötige, da ein Inputsource bei der evaluate methode benötigt wird. 

Eine Lösung für mein Problem habe ich bereits gefunden, indem ich die Datei als String speichere und den String mit einem StringReader zum inputsource mache und einen Singleton verwende. 

```
try {
			XPath xpath = XPathFactory.newInstance().newXPath();
			InputSource inputSource = new InputSource(new StringReader(xml));

			NodeList nodelist= (NodeList)xpath.evaluate(xpathExpression, inputSource,
					XPathConstants.NODESET);

			for (int i = 0; i < nodelist.getLength(); i++) {
				result.add(nodelist.item(i).getNodeValue());
			}
		} catch (XPathExpressionException e) {
			e.printStackTrace();
		}
```


----------

