2010-01-16 226 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