2014-01-07 3 views
1

Я погрузочные фид XML с YouTube Into 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(), но это возвращается нуль. element.Nodes().Count() ответил 41, поэтому я должен попытаться получить узлы с именем entry?

ответ

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, который включает это пространство имен, чтобы соответствовать «входным» узлам

Смежные вопросы