所以我有一个项目,我需要拉一个每5分钟更新一次的xml文件。但是我正在设计我的程序以在每次更新时提取此文件。
xml文件的数据结构是这样的......
<m:REPORT_DATA>
<m:DATA_ITEM>ENC</m:DATA_ITEM>
<m:RESOURCE_NAME>DLAP</m:RESOURCE_NAME>
<m:OPR_DATE>2012-06-02</m:OPR_DATE>
<m:INTERVAL_NUM>1</m:INTERVAL_NUM>
<m:VALUE>16.77734</m:VALUE>
</m:REPORT_DATA>
<m:REPORT_DATA>
<m:DATA_ITEM>ENC</m:DATA_ITEM>
<m:RESOURCE_NAME>DLAP</m:RESOURCE_NAME>
<m:DATE>2012-06-02</m:OPR_DATE>
<m:INTERVAL_NUM>2</m:INTERVAL_NUM>
<m:VALUE>16.77739</m:VALUE>
</m:REPORT_DATA>
....
假设我当天第200次拉它,我怎么才抓住最后一个值
"<m:VALUE>16.77739</m:VALUE>"
为我的数据库获取该值?
我对使用Sax,Xpath或DOM感到很沮丧。一些帮助会很棒。
答案 0 :(得分:4)
如果您有根,请说<m:REPORTS>
,使用XPath查找最后一个VALUE会非常简单:
XPathFactory f = XPathFactory.newInstance() ;
XPath x = f.newXPath() ;
try {
InputSource source = new InputSource(new FileInputStream("logfile.xml")) ;
XPathExpression expr = x.compile("//REPORT_DATA[DATA_ITEM='ENC'][last()]/VALUE/text()") ;
String s = expr.evaluate(source) ;
System.out.println("Last value: " + s ) ;
}
catch(Throwable t) {
System.err.println("Error: " + t) ;
}
答案 1 :(得分:4)
这不是一个结构良好的xml, 例如,您可以使用xpath查找最后一个节点 // REPORT_DATA [position()= last()] 返回最后一个REPORT_DATA节点 并使用xpath读取xml,请参阅How to read XML using XPath in Java
// REPORT_DATA [最后一个()] / DATA_ITEM [文本()= “ENC”]
并返回节点,它的DATA_ITEM等于“ENC”
或// REPORT_DATA [last()] / VALUE [text()=“ENC”]
答案 2 :(得分:0)
这不是“XML文件”,因为它没有格式良好,因为它没有根元素(或者它有多个根元素)。因此,它不能由XML库直接加载,因此您不能使用DOM,XPath或XSLT。
最好使用一些简单的模式匹配来检测每个段的开始,找到最后一个段,然后仅将该段加载到DOM中进行提取。
答案 3 :(得分:0)
使用SAX。
使用xpath或DOM,您必须构建一个速度慢且内存昂贵的DOM,尤其是对于1次查找。
SAX速度更快,但需要您跟踪您的位置和状态,在您的情况下应该很容易。只需查找您的REPORT_DATA元素,收集其封装的数据,如果它是最后一个(到达最终文档),您就有了输出。
答案 4 :(得分:0)
//filePath the path to the file you want to parse, tag the tag of the node you want to search.
public static String getLastNode(String filePath, String tag) throws ParserConfigurationException, SAXException, IOException{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = docBuilder.parse(filePath);
return doc.getElementsByTagName(tag).item(doc.getElementsByTagName(tag).getLength()-1).getTextContent();
//if you don't care about specific tag name just use :
//return doc.getLastChild().getTextContent;
}