2014-01-07 44 views
1

我加載從YouTube的XML提要到的XElement像這樣:的XElement - 獲取元素

XElement element = XElement.Load(url); 

這是很好,我得到一個文件,看起來像這樣:

<?xml version='1.0' encoding='UTF-8' ?> 
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' xmlns:opensearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:yt='http://gdata.youtube.com/schemas/2007'> 
    <id>http://gdata.youtube.com/feeds/api/users/id/uploads</id> 
    <updated>2014-01-07T11:43:08.269Z</updated> 
    <category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#video'/> 
    <title type='text'>Uploads by id</title> 
    <logo>http://www.gstatic.com/youtube/img/logo.png</logo> 
    <link rel='related' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/stonemarketuk'/> 
    <link rel='alternate' type='text/html' href='https://www.youtube.com/channel/333/videos'/> 
    <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/id/uploads'/> 
    <link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/id/uploads/batch'/> 
    <link rel='self' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/id/uploads?start-index=1&amp;max-results=25'/> 
    <link rel='next' type='application/atom+xml' href='https://gdata.youtube.com/feeds/api/users/id/uploads?start-index=26&amp;max-results=25'/> 
    <author> 
    <name>StonemarketUK</name> 
    <uri>https://gdata.youtube.com/feeds/api/users/id</uri> 
    </author> 
    <generator version='2.1' uri='http://gdata.youtube.com'>YouTube data API</generator> 
    <openSearch:totalResults>30</openSearch:totalResults> 
    <openSearch:startIndex>1</openSearch:startIndex> 
    <openSearch:itemsPerPage>25</openSearch:itemsPerPage> 
    <entry> 
     ....entry elements 
    </entry> 
    <entry> 
     ....entry elements 
    </entry> 
</feed> 

怎麼辦我獲得入門元素?我曾嘗試以下:

var entries = element.Elements("entry"); 
var entries = element.Element("feed").Elements("entry"); 
var entries = element.Nodes().Elements("entry"); 

但這些都不返回任何

我也調試,並試圖element.Elements().FirstOrDefault()但這返回null。 element.Nodes().Count()返回41,所以我應該試圖獲得稱爲條目的節點?

回答

6

所有元素都在命名空間中(xmlns='http://www.w3.org/2005/Atom')。您必須聲明原子命名空間並使用它。

這很容易:

XNamespace atom = "http://www.w3.org/2005/Atom"; 

var xml = XElement.Load(url); 
var entry = xml.Elements(atom + "entry"); 

一個簡單的方法來得到正確的元素名稱使用XName.Get()。如果你只有一個命名空間,你可以把它放在一個單獨的功能:

internal static XName GetXName(string name) 
{ 
    string atomNamespace = "http://www.w3.org/2005/Atom"; 
    return XName.Get(name, atomNamespace); 
} 
+0

完美的感謝,當你知道如何時,這非常簡單!將在3分鐘內接受當它讓我 – Pete

+0

+1那裏。 –

1

請嘗試以下

var entryList = element.Elements().Where(x => x.Name.LocalName == "entry"); 

這裏的問題是,如果沒有一個明確的命名空間中的每一個元素是隱含在命名空間"http://www.w3.org/2005/Atom" 。如上所示,LocalName屬性仍可用於訪問簡單名稱。除非你需要構建一個包含這個命名空間的適當的XName元素,以便匹配'入口'節點