Pro každý element Snapshot tedy chcete vypsat tu trojici?
Element root = document.getRootElement();
for (Element snapshotElement : (List<Element>) root.elements("Snapshot")) {
System.out.printf("Value: %s%s%s",
snapshotElement.selectObject("Stats[@name='jvmRuntimeModule']/CS[@id='2']/@ct"),
snapshotElement.selectObject("Stats[@name='systemModule']/CS[@id='1']/@ct"),
snapshotElement.selectObject("Stats[@name='connectionPoolModule']/RS[@id='9']/@cur")
).println();
System.out.println("*****************************************");
}
Dá se to optimalizovat, ty XPath výrazy se nemusí parsovat v každé iteraci cyklu, ale je možné si je vytvořit předem a v cyklu volat xpath1.evaluate(snapshotElement).
Pokud by ty XML soubory byly velké (stovky MB), stejně nedoporučuju používat SAX nebo StAX, protože jsou to zbytečně nízkoúrovňová API a to samé se dá zvládnout i s vysokoúrovňovými knihovnami. Např. s dom4j se dá použít ElementHandler:
SAXReader reader = new SAXReader();
reader.addHandler( "/TPVLog/Snapshot",
new ElementHandler() {
public void onStart(ElementPath path) {
// Jsme na začátku elementu, neděláme nic
}
public void onEnd(ElementPath path) {
Element snapshotElement = path.getCurrent();
//Tady už máme zkonstruovaný strom pro element Snapshot, takže na něm můžeme zavolat úplně ten samý kód, jako v prvním příkladu:
System.out.printf("Value: %s%s%s",
snapshotElement.selectObject("Stats[@name='jvmRuntimeModule']/CS[@id='2']/@ct"),
snapshotElement.selectObject("Stats[@name='systemModule']/CS[@id='1']/@ct"),
snapshotElement.selectObject("Stats[@name='connectionPoolModule']/RS[@id='9']/@cur")
).println();
System.out.println("*****************************************");
//zpracovaný element odstraníme z dokumentu, aby zbytečně nezabíral místo
snapshotElement .detach();
}
}
);
Document document = reader.read(url);
//z dokumentu zbyla jen obálka, ale to nevadí, můžeme ho zahodit