具有名称空间的XML文档上的XPath
问题描述:
我正在使用这个名称空间的XML文档,并且我想使用XPath提取一些节点。具有名称空间的XML文档上的XPath
这里的文件:
<ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
<anyType xsi:type="Document">
<Id>5</Id>
<Title>T1</Title>
</anyType>
<anyType xsi:type="Document">
<Id>15</Id>
<Title>T15</Title>
</anyType>
</ArrayOfAnyType>
什么是XPath表达式将是,如果我想提取与XSI所有“anyType的”元素:类型=“文件”?
我已经试过这样:
//anyType[@xsi:type="Document"]
,它不工作:
答
如果您使用的是C#,那么你需要指定命名空间为您的XPath的“anyType的”元素:
var xml = new XmlDocument();
xml.LoadXml("your xml");
var names = new XmlNamespaceManager(xml.NameTable);
names.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
names.AddNamespace("a", "http://tempuri.org/");
var nodes = xml.SelectNodes("//a:anyType[@xsi:type='Document']", names);
答
我认为
//anyType[namespace-uri() = "http://www.w3.org/2001/XMLSchema-instance"][local-name() = "type"]
会做你想做的。
答
有几乎同样的问题,我忘了补充用于XSI正确的命名空间:类型 (http://www.w3.org/2001/XMLSchema-instance)用http://www.w3.org/2001/XMLSchema ,我也从来没有得到任何结果 - 现在,它正在通过以下方式:
<xsl:value-of select="/item1/item2/item3/@xsi:type"></xsl:value-of>
答
这种方式你不需要指定命名空间:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("your xml");
XmlNode node = xmlDoc.SelectSingleNode("/*[local-name() = 'anyType']");
XmlNode nodeToImport = xmlDoc2.ImportNode(node, true);
xmlDoc2.AppendChild(nodeToImport);
你使用哪个版本的xpath? xpath版本处理名称空间的方式不同? – 2009-02-18 16:32:20
看起来像我不得不说:'// xmlns:anyType [@xsi:type =“Document”]'它可以工作 – EnToutCas 2009-02-18 17:19:00
Duped: - http://stackoverflow.com/questions/536441/xpath-namespace-driving -me-crazy - http://stackoverflow.com/questions/11345/xpaths-and-default-namespaces - http://stackoverflow.com/questions/103576/whats-wrong-with-my-xpath-xml – annakata 2009-02-18 16:47:50