Java XML解析器 - 获得适当的输出

时间:2015-04-15 10:21:01

标签: java xml parsing

我需要创建一个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没有多少经验,所以我想请求帮助。

1 个答案:

答案 0 :(得分:0)

用Java编写此代码的唯一可能原因是,您恰好了解Java并且没有时间学习专门为此类任务设计的XSLT和XQuery等语言。由于您不是Java专家,因此该原因不适用于您。

我不确定您希望输出看起来如何,但您可以从运行以下XQuery开始:

//Snapshot/concat(
   Stats[@name="jvmRuntimeModule"]/CS[@id='3']/@ct, 
   '&#xa;',
   Stats[@name="systemModule"]/CS[@id='1']/@ct) 

根本不需要任何Java代码。