3

所以我有一个项目,我需要提取每 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 感到很痛苦。一些帮助将是惊人的。

4

5 回答 5

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) ;
    }
于 2012-07-03T18:56:37.113 回答
4

这不是格式良好的 xml,您可以使用 xpath 查找最后一个节点,例如 //REPORT_DATA[position() = last()] 返回最后一个 REPORT_DATA 节点,对于使用 xpath 读取 xml,请参阅如何使用 XPath 读取 XML爪哇

//REPORT_DATA[last()]/DATA_ITEM[text()="ENC"]

这将返回节点,它的 DATA_ITEM 等于“ENC”

或 //REPORT_DATA[last()]/VALUE[text()="ENC"]

于 2012-07-03T19:01:17.537 回答
0

这不是一个“XML 文件”,因为它没有根元素(或者它有多个根元素),因此它的格式不正确。因此,它不能由 XML 库直接加载,因此您不能使用 DOM、XPath 或 XSLT。

您最好使用一些简单的模式匹配来检测每个段的开头,找到最后一个段,然后仅将该段加载到 DOM 中进行提取。

于 2012-07-03T18:50:02.370 回答
0

使用 SAX。

使用 xpath 或 DOM,您必须构建一个缓慢且内存昂贵的 DOM,尤其是对于 1 次查找。

SAX 更快,但需要您跟踪您的位置和状态,在您的情况下这应该很容易。只需查找您的 REPORT_DATA 元素,收集其封装的数据,如果它是最后一个(到达的最终文档),您就有了输出。

于 2012-07-03T19:04:23.627 回答
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;


}
于 2012-07-03T19:12:31.960 回答