我认为我正确设置了命名空间解析器,
var nodes=xml.evaluate(path, //xpathExpression
xml, //contextNode
NSResolver, //namespaceResolver
XPathResult.ANY_TYPE, //resultType
null //result
);
我认为我设置的路径正确,(我在这里尝试了很多变化,几乎任何可能有效的东西)
path="/";
但是nodes.iterateNext()似乎告诉我我做错了什么:
firebug output : nodes : [object XPathResult] length : undefined
x 和 xml 对象很好,因为我可以在 firebug 中看到它们和 xml。如果你使用我的代码,我只是在 chrome 中测试,所以如果你使用 IE,你可能会遇到一大堆蠕虫。 :)
这是 xml(经过净化的版本)
<dataset xmlns="http://stub.test.data1" xmlns:xs="http://another.stub.test.moredata">
<!--
<dataset
xmlns="http://stub.test.data1"
xmlns:xs="http://another.stub.test.moredata"
xs:schemaLocation="http://yet.more.stub.test.data/xmldata.xsd"
>
-->
<metadata>
<item name="a" type="xs:string" length="92"/>
<item name="b" type="xs:string" length="50"/>
<item name="c" type="xs:short" precision="1"/>
<item name="d" type="xs:string" length="66"/>
<item name="e" type="xs:string" length="26"/>
<item name="f" type="xs:string" length="6"/>
<item name="g" type="xs:string" length="264"/>
<item name="h" type="xs:double" precision="2"/>
<item name="i" type="xs:string" length="22"/>
<item name="j" type="xs:date"/>
<item name="k" type="xs:date"/>
<item name="l" type="xs:string" length="16"/>
<item name="m" type="xs:short" precision="1"/>
<item name="n" type="xs:short" precision="1"/>
<item name="o" type="xs:string" length="50"/>
</metadata>
<data>
<row>
<value>someData1</value>
<value>someData2</value>
<value>someData3</value>
<value>someData4</value>
<value>someData5</value>
<value>someData6</value>
<value>someData7</value>
<value>someData8</value>
<value>someData9</value>
<value>someData10</value>
<value>someData11</value>
<value>someData12</value>
<value>someData13</value>
<value>someData14</value>
<value>someData15</value>
</row>
</data>
</dataset>
这是 javascript:
function loadXMLDoc(dname)
{
if (window.XMLHttpRequest)
{
xhttp=new XMLHttpRequest();
}
else
{
xhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
//initializes the request
xhttp.open("GET",dname,false);//method, url, optional async defaults to true
try {xhttp.responseType="msxml-document"} catch(err) {
console.log('hey, an error occured');
} // Helping IE
xhttp.send("");//send the request. Does not return till the response is returned (due to false above)
return xhttp;
}
function NSResolver(nsPrefix) {
console.log("nsPrefix : " + nsPrefix);
if(nsPrefix == "xs") {
return "http://www.w3.org/2001/XMLSchema-instance";
}
}
function displayNodes() {
// code for IE
if (window.ActiveXObject || xhttp.responseType=="msxml-document")
{
console.log('code for IE');
console.log('path=' + path);
xml.setProperty("SelectionLanguage","XPath");
nodes=xml.selectNodes(path);
for (i=0;i<nodes.length;i++)
{
document.write(nodes[i].childNodes[0].nodeValue);
document.write("<br>");
}
}
// code for Chrome, Firefox, Opera, etc.
else if (document.implementation && document.implementation.createDocument)
{
console.log('code for chr / ff / op');
console.log('path=' + path);
//docs : http://help.dottoro.com/ljruhkuj.php
var nodes=xml.evaluate(path, //xpathExpression
xml, //contextNode
NSResolver, //namespaceResolver
XPathResult.ANY_TYPE, //resultType
null //result
);
console.log("nodes : " + nodes + " length : " + nodes.length);
var result=nodes.iterateNext();
while (result)
{
document.write(result.childNodes[0].nodeValue);
document.write("<br>");
result=nodes.iterateNext();
}
}
document.write('shit should have displayed by now');
}
path="/";
function reload() {
x=loadXMLDoc("testxml.xml"); //x is now a XMLHttpRequest object
xml=x.responseXML; //xml is now a response to the request, or null if it failed
displayNodes();
console.log("x (XMLHTTPRequest Object) : " + x);
console.log("xml (XMLHTTPRequest.responseXML) : " + xml);
}
reload();
最佳答案
查看 Mozilla 的文档 using XPath in Javascript ,似乎 XPathResult 对象没有 length
这样的属性你所要求的。
所以当 Firebug 说length : undefined
时,这并不一定意味着您在 XPath 路径或 evaluate()
的使用中做错了什么。 。我认为你做错的唯一一件事就是要求 nodes.length
.
如果您的结果是快照,您可以要求nodes.snapshotLength,但事实并非如此:
When the result type in the resultType parameter is specified as ANY_TYPE, ... if the returned result type is a node-set then it will only be an UNORDERED_NODE_ITERATOR_TYPE.
现在,当您进行迭代时,您应该得到一个结果节点:文档根节点,即 <dataset>
的(不可见)父节点。元素。接下来,您要求它打印 result.childNodes[0].nodeValue
。 result.childNodes[0]
应该是<dataset>
元素。 .nodeValue
根据 these docs ,元素的 为 null 。所以想必您的 document.write() 没有显示任何内容。
相反,请尝试打印 result.nodeName
(docs here)。这应该给出 #document
根节点,或者您选择的元素的名称。
如果您只是想让某些东西工作,并验证它是否正常工作,我会将您的路径更改为 "/*"
。您将获得更具体的结果,即 <dataset>
元素。
关于javascript - 使用 xpath 通过 javascript 从 XML 中获取内容时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26371365/