选择具有特定值的子节点的特定节点

时间:2016-07-28 18:21:20

标签: javascript xml xpath

我有这样的事情:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <Row>
    <Cell>some value</Cell>
    <Cell>some value</Cell>
    ... continues with around 800 other Cells
  </Row>
  ...continues with around 2000 other Rows

第一个问题: 通过使用xpath选择xml数据,我想选择一个具有特定值的单元格的Row。我该怎么做到这一点?这是什么xpath语法?

第二个问题: 我的xml数据大约是1.6米的代码行,从中选择数据需要很长时间,除了它的重量大约为80Mbs!如何使这个过程更有效并提高性能? p.n我使用下面的代码来检索xml数据:

function loadXMLDoc(dname)
{
    xhttp=new XMLHttpRequest();
    xhttp.open("GET", dname ,false);
    xhttp.send("");
    return xhttp;
}

var x=loadXMLDoc("data/data.xml");
var xml=x.responseXML;
path="some path";
if (document.implementation && document.implementation.createDocument)
{
    var nodes=xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null);
    var result=nodes.iterateNext();

    while (result)
    {
        document.write(result.childNodes[0].nodeValue);
        document.write("<br>");
        result=nodes.iterateNext();
    }
}

1 个答案:

答案 0 :(得分:0)

回答问题的第一部分:

//row[./cell/text() = '3']

将此XPath表达式应用于以下XML

<root>
  <row>
    <cell>1</cell>
    <cell>2</cell>
  </row>
  <row>
    <cell>3</cell>
    <cell>4</cell>
  </row>
</root>

产生以下输出:

> xmllint -xpath "//row[./cell/text() = '3']" test.xml 
<row>
  <cell>3</cell>
  <cell>4</cell>
</row>

至于问题的第二部分,问题是为这么大的文档构建完整的DOM是非常昂贵的。所以你需要研究事件驱动的解析(SAX,参见https://en.wikipedia.org/wiki/Simple_API_for_XML),但我没有个人经验。