选择具有特定价值
一个子节点的特定节点我有这样的事情:选择具有特定价值
<?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数据,我要选择具有行具有特定值的单元格。我怎么能做到这一点?这是什么xpath语法?
第二个问题: 我的XML数据是各地的1.6M码和选择数据线从它需要很长的时间,除了一个事实,即它重约80Mbs!我怎样才能使这个过程更有效,提高性能? PN我用下面的代码来检索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();
}
}
回答你的问题的第一部分:
//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),但我没有亲身经历。
谢谢!顺便说一下,你认为XPath是我可以从JavaScript检索XML数据的最佳方式吗? –
@MehdiJorJor对不起,我没有太多的Javascript经验。 – Markus
xpath'//Cell[.==some value']'应该检索具有文本内容的单元格作为'some value'的节点 – SomeDude
@svasa,但是这只能选择具有该值的单元格。我想选择它的父母!有没有办法做到这一点 ? –
是的。 ''//Cell[.='some value']/..'会给父节点'行' – SomeDude