Разбор XML с помощью C # - PullRequest
2 голосов
/ 18 марта 2012

У меня есть xml как

<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/' xmlns:docs='http://schemas.google.com/docs/2007' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/&quot;C0EARXY8eit7ImA9WhVREE0.&quot;'>

<id>https://docs.google.com/feeds/default/private/full</id>
<updated>2012-03-17T16:27:24.872Z</updated>
<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/docs/2007#item' label='item'/>

<title>Available Documents - </title>

<link rel='alternate' type='text/html' href='https://docs.google.com'/>
<link rel='http://schemas.google.com/g/2005#resumable-create-media' type='application/atom+xml' href='https://docs.google.com/feeds/upload/create-session/default/private/full'/>
<link rel='http://schemas.google.com/docs/2007#alt-post' type='application/atom+xml' href='https://docs.google.com/feeds/upload/file/default/private/full'/>
<link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://docs.google.com/feeds/default/private/full'/>
<link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='https://docs.google.com/feeds/default/private/full'/>
<link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' href='https://docs.google.com/feeds/default/private/full/batch'/>
<link rel='self' type='application/atom+xml' href='https://docs.google.com/feeds/default/private/full/-/document'/>

<some more tags />

<entry gd:etag='&quot;E0UXTh9YDSt7ImBr&quot;'>
<some more tags />
<title>hi</title>
<link rel='http://schemas.google.com/docs/2007#parent' type='application/atom+xml' href=''/>
<link rel='alternate' type='application/atom+xml' href=''/>
<link rel='http://schemas.google.com/docs/2007#embed' type='application/atom+xml' href=''/>
<link rel='http://schemas.google.com/docs/2007#icon' type='application/atom+xml' href=''/>
<link rel='http://schemas.google.com/g/2005#resumable-edit-media' type='application/atom+xml' href=''/>
<link rel='http://schemas.google.com/docs/2007#alt-edit-media' type='application/atom+xml' href=''/>
<link rel='http://schemas.google.com/docs/2007/thumbnail' type='application/atom+xml' href=''/>
<link rel='self' type='application/atom+xml' href=''/>
<link rel='edit' type='application/atom+xml' href=''/>
<link rel='edit-media' type='application/atom+xml' href=''/>
...
<some more tags />
...
</entry>
<entry>
...
</entry>
...

Я хочу получить атрибут href элемента <link>, чей rel="http://schemas.google.com/g/2005#resumable-create-media"

То, что я делаю сейчас, - это получение списка узлов с xmlnode = doc.GetElementsByTagName("link");, затем я перебираю все из них и выбираю первый, чей rel="http://schemas.google.com/g/2005#resumable-create-media"

Так что, по сути, я перебираю все узлы <link>, когда меня просто интересуют те, которые являются следующими потомками узла <feed> и не находятся внутри узла <entry>. У <feed> есть несколько <entry> узлов, которые в свою очередь имеют несколько тегов <link>. И вместо этого я хотел бы просто получить список <link>, который находится непосредственно в <feed>, а не в <entry>.

Буду признателен за любую помощь.

Ответы [ 3 ]

3 голосов
/ 18 марта 2012

Я бы использовал XPath:

var nodes = xml.SelectNodes("//link[@rel='http://schemas.google.com/g/2005#resumable-create-media']", namespaceManaager)

(где namespaceManaager - это XmlNamespaceManager, настроенный для сопоставления тега a с пространством имен http://www.w3.org/2005/Atom).

1 голос
/ 18 марта 2012

Обычно я использую классы System.Xml.Linq.XElement для работы с xml в C #.Если я понимаю вашу проблему, это может выглядеть так:

XElement input = XElement.Load(filename);
foreach(XElement feedChild in input.Elements("feed"))
  foreach(XElement linkChild in feedChild.Elements("link"))
1 голос
/ 18 марта 2012

LINQ To XML кажется хорошим выбором для этого, так как вы можете легко проанализировать свое дерево XML.

Посмотрите на официальный пример:

http://msdn.microsoft.com/en-us/library/bb387041.aspx

...