我需要创建一个Java程序,它将读取XML文件并在一行上打印节点属性。
以下XML是要处理的文件:
<TPVLog version="6.0">
<Snapshot time="1427376440905">
<Stats name="jvmRuntimeModule" statType="jvmRuntimeModule#" il="-2" type="COLLECTION">
<CS id="2" sT="1422004481541" lST="1427376440605" ct="234457">
</CS>
<CS id="3" sT="1422004481541" lST="1427376440605" ct="494333">
</CS>
<CS id="5" sT="1422004481541" lST="1427376440605" ct="0">
</CS>
</Stats>
<Stats name="systemModule" statType="systemModule" il="-2" type="MODULE">
<CS id="1" sT="1427192170123" lST="1427376470956" ct="61">
</CS>
</Stats>
</Snapshot>
</TPVLog>
我需要从jvmRuntimeModule中输出行cs id =“3”value ct 从一行中的cs id =“1”的systemModule值ct开始。
我试图通过以下方式获得结果:
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.dom4j.XPath;
public class DOM4JParserDemo {
public static void main(String[] args) throws DocumentException {
File inputFile = new File("tpv_as_aexwidget_1_1427376430227_1.xml");
SAXReader reader = new SAXReader();
Document document = reader.read( inputFile );
Element root = document.getRootElement();
for (Element snapshotElement : (List<Element>) root.elements("Snapshot")) {
XPath xpath=snapshotElement.createXPath("Stats[@name='connectionPoolModule']/RS[@id='9']/@cur");
System.out.printf("%s",xpath.evaluate(document.getRootElement()));
System.out.println("************** END ************************");
}
}
}
或
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("*****************************************");
}
但我的输出打印行数等于文件中的快照数,但值为空。 我对Java没有多少经验,所以我想请求帮助。
答案 0 :(得分:0)
用Java编写此代码的唯一可能原因是,您恰好了解Java并且没有时间学习专门为此类任务设计的XSLT和XQuery等语言。由于您不是Java专家,因此该原因不适用于您。
我不确定您希望输出看起来如何,但您可以从运行以下XQuery开始:
//Snapshot/concat(
Stats[@name="jvmRuntimeModule"]/CS[@id='3']/@ct,
'
',
Stats[@name="systemModule"]/CS[@id='1']/@ct)
根本不需要任何Java代码。