2010-01-16 125 views
5

我有不同的命名空间的XML,我想用.SelectNodes查询(字符串XPATH)的XPath XML命名空间

,我注意到这样的问题,只要我把所有XPath查询任何回报那些命名空间。

  1. 反正是有告诉XmlDocument.SelectNodes忽略这些命名空间,只是让我正确的元素(即我查询似乎不具有名称空间前缀的元素)?

  2. 如果有,任何人都可以请给我一个如何做的例子吗?我在查询节点之前/何时应该定义什么?

感谢您的帮助。

更正:我仍然无法确定问题是什么。这里是我的xml:

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:gf="http://schemas.google.com/finance/2007" 
     xmlns:gd="http://schemas.google.com/g/2005" > 
    <id>http://finance.google.com/finance/feeds/[email protected]/portfolios</id> 
    <updated>2009-12-15T19:32:21.000Z</updated> 
    <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/finance/2007#portfolio" /> 
    <title type="text" >Portfolio Feed</title> 
    <link rel="alternate" type="text/html" href="http://finance.google.com/finance/portfolio?action=view" /> 
    <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://finance.google.com/finance/feeds/default/portfolios" /> 
    <link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="http://finance.google.com/finance/feeds/default/portfolios" /> 
    <link rel="self" type="application/atom+xml" href="http://finance.google.com/finance/feeds/default/portfolios" /> 
    <openSearch:totalResults>24</openSearch:totalResults> 
    <openSearch:startIndex>1</openSearch:startIndex> 
    <openSearch:itemsPerPage>24</openSearch:itemsPerPage> 
    <entry> 
    <id>http://finance.google.com/finance/feeds/[email protected]/portfolios/2</id> 
    <updated>2009-12-14T16:26:53.000Z</updated> 
    <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/finance/2007#portfolio" /> 
    <title type="text" >Main</title> 
    <link rel="self" type="application/atom+xml" href="http://finance.google.com/finance/feeds/default/portfolios/2" /> 
    <link rel="edit" type="application/atom+xml" href="http://finance.google.com/finance/feeds/default/portfolios/2" /> 
    <gd:feedLink href="http://finance.google.com/finance/feeds/[email protected]/portfolios/2/positions" /> 
    <gf:portfolioData currencyCode="USD" gainPercentage="0.0" return1w="0.0" return1y="0.0" return3m="0.0" return3y="0.0" return4w="0.0" return5y="0.0" returnOverall="0.0" returnYTD="0.0" /> 
    </entry> 
</feed> 

这里是我的代码:

XmlDocument的XML = ExecuteRequest(URL);

 var xmlnsManager = new System.Xml.XmlNamespaceManager(xml.NameTable); 
     xmlnsManager.AddNamespace("xmlns:openSearch", "http://a9.com/-/spec/opensearchrss/1.0/"); 
     xmlnsManager.AddNamespace("xmlns:gf", "http://schemas.google.com/finance/2007"); 
     xmlnsManager.AddNamespace("xmlns:gd", "http://schemas.google.com/g/2005"); 

     var nodes = xml.SelectNodes("//feed/entry", xmlnsManager); 

和我的节点数仍然是0!任何想法?

回答

-1

发现这里另一篇文章的问题: No Nodes Selected from Atom XML document using XPath?

谢谢大家。

+1

仅链接答案是很差的答案。您应该包含链接答案中的实质性内容。然而,在这种情况下,一旦你这样做,你的答案就会类似于[Darrel Miller的回答](http://stackoverflow.com/a/2075794/2704659),在我看来,这应该是这里公认的答案,不是你的。 – 2016-07-15 15:26:35

9

您需要创建一个名称空间管理器,设置您要使用的所有命名空间及其前缀,然后在XPath中,您需要使用前缀。

var doc = new XmlDocument(); 
doc.Load("myfile.xml"); 

var xmlnsManager = new System.Xml.XmlNamespaceManager(doc.NameTable); 
xmlnsManager.AddNamespace("ns", "http://example.org/schema.xsd"); 

doc.SelectNodes("//ns:MyElement",xmlnsManager); 

警告:我没有编译此代码。

+1

+1,编译正确 – 2010-01-16 01:10:34

2

我不太熟悉.NET api,但是您可以发送更通用的XPATH,通过匹配任何元素(例如*)和在谓词过滤器中使用local-name来忽略名称空间。

例如使用/*[local-name()='foo']/*[local-name()='bar']/*[local-name()='baz'] 找到ns:foo/ns:bar/ns:baz而不声明ns命名空间。

这样你就不必在编译时绑定到特定的命名空间,并且可以通过arbritrary XPATH语句。

很显然,通过使用无命名空间的XPATH语句,您可能会得到意想不到的结果(如果混合的名称空间内容具有相同名称的元素)并且XPATH非常冗长。

XPATH 2.0您可以使用通配符命名空间:/*:foo/*:bar/*:baz,但你将不得不使用Saxon得到XSLT/XPATH在.NET 2.0支持。

+0

实际上,Altova有一个免费的基于COM的XSLT 2.0处理器,但可以从.Net访问。 (http://www.altova.com/altovaxml。HTML)和英特尔最近发布的运行在64位窗口上的XSLT 2.0处理器。 http://software.intel.com/en-us/articles/intel-soa-expressway-xslt-20-processor/ – 2010-01-16 15:34:49