complexes XPath Problem

chickenwings

Erfahrenes Mitglied
Hallo Experten

ich suche ein Möglichkeit mit Hilfe von XPath folgendes XML zu parsen:
Auszug:
Code:
<root>
  <rows>
    <row name="id">999</cell>
    <row name="blabla">-</cell>
    <row name="datum">10.11.2010</cell>
    <row name="request">345</cell>
    <row name="value">0</cell>
  </rows>
  <rows>
    <row name="id">888</cell>
    <row name="blabla">piep</cell>
    <row name="datum">10.11.2010</cell>
    <row name="request">7</cell>
    <row name="value">1</cell>
  </rows>
...

Ich habe bisher folgendes, das mir immerhin alle Werte der Knoten mit dem Attribut "datum" und dem Wert "10.11.2010" ausgibt, allerdings nur den Wert des Knotens, den ich ja abfrage.
Code:
XPathExpression expr = xpath.compile("//root/rows/row[@name='datum'][text()='10.11.2010']/text()");

Mein Problem ist, ich möchte gerne die Werte der Knoten "request" und "value", nicht aber "id" und "blabla".

Kann mir jemand bei dem entsprechenden Ausdruck helfen?

Vielen Dank
chickenwings
 
Hallo Thomas,

vielen Dank für Deine Antwort.
Bin etwas weitergekommen, meine Erweiterung sieht bisher so aus:
Code:
XPathExpression expr = xpath.compile("//root/rows/row[@name='datum'][text()='10.11.2010']/../row[@name='request' or @name='value']/text()");

Es wird mir auch eine NodeList angezeit, durch die ich durchiterieren kann. Etwas unschön ist, dass natürlich jetzt sämtliche Fundstellen in einer einzigen Liste aufgeführt werden. Schöner wäre es, wenn man nach "row" gruppieren könnte.

Denke aber, dafür müsste ich einen anderen XPath-Ausdruck verwenden, oder?

Grüsse,
chickenwings
 
Hallo,

btw... dein Beispiel xml ist "etwas" daneben...

ich habs für die Tests mal angepasst:

data/rows.xml:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<rows>
  <row>
    <cell name="id">999</cell>
    <cell name="blabla">-</cell>
    <cell name="datum">10.11.2010</cell>
    <cell name="request">345</cell>
    <cell name="value">0</cell>
  </row>
  <row>
    <cell name="id">888</cell>
    <cell name="blabla">piep</cell>
    <cell name="datum">10.11.2010</cell>
    <cell name="request">7</cell>
    <cell name="value">1</cell>
  </row>
  
  
  <row>
    <cell name="id">777</cell>
    <cell name="blabla">foo</cell>
    <cell name="datum">11.11.2010</cell>
    <cell name="request">9</cell>
    <cell name="value">222</cell>
  </row>
 </rows>


hier noch eine Alternative Lösung mit XPath:
- Zuerst die passenden Rows nach dem Wunschkriterium selektieren
- Anschließend weiteren XPath anwenden um die Teilinformationen zu extrahieren.

Java:
package de.tutorials;

import java.io.FileInputStream;

import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

public class XPathProjectionExample {
	public static void main(String[] args) throws Exception {
		String selectRowsXPath = "//row/cell[@name='datum' and text()='10.11.2010']/..";
		XPathFactory xf = XPathFactory.newInstance();
		NodeList matchingRows = (NodeList) xf.newXPath().evaluate(selectRowsXPath,new InputSource(new FileInputStream("data/rows.xml")),XPathConstants.NODESET);

		String extractRequestAndValueXPath = "concat(cell[@name='request']/text(),';',cell[@name='value']/text())";
		for (int i = 0; i < matchingRows.getLength(); i++) {
			Node matchingRow = matchingRows.item(i);
			String requestValue = xf.newXPath().evaluate(extractRequestAndValueXPath,matchingRow);
			System.out.println(requestValue);
		}

	}
}

Ausgabe:
Code:
345;0
7;1



Gruß Tom
 
Zuletzt bearbeitet von einem Moderator:
Hi Thomas,

wow, funktioniert einwandfrei und sieht nach einer eleganten Lösung aus.
Vielen Dank für Deine Hilfe.

Grüsse,
chickenwings
 
Zurück