具有名称空间的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"] 

,它不工作:

+0

你使用哪个版本的xpath? xpath版本处理名称空间的方式不同? – 2009-02-18 16:32:20

+0

看起来像我不得不说:'// xmlns:anyType [@xsi:type =“Document”]'它可以工作 – EnToutCas 2009-02-18 17:19:00

+0

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

如果您使用的是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);