Разбор сложного XML с C # - PullRequest
4 голосов
/ 08 июня 2011

Я пытаюсь разобрать сложный XML с C #, я использую Linq для этого.По сути, я делаю запрос к серверу и получаю XML, это код:

XElement xdoc = XElement.Parse(e.Result);
this.newsList.ItemsSource = 
  from item in xdoc.Descendants("item")
  select new ArticlesItem
  {
    //Image = item.Element("image").Element("url").Value,
    Title = item.Element("title").Value,
    Description = this.Strip(item.Element("description").Value).Substring(0, 200).ToString()
  }

И это структура XML:

<item>
  <test:link_id>1282570</test:link_id>
  <test:user>SLAYERTANIC</test:user>
  <title>aaa</title>
  <description>aaa</description>
</item>

Как получить доступ ктест свойства: link_id например?

Спасибо!

Ответы [ 2 ]

8 голосов
/ 08 июня 2011

В настоящее время ваш XML недопустим, поскольку пространство имен test не объявлено, вы можете объявить его следующим образом:

<item xmlns:test="http://foo.bar">
  <test:link_id>1282570</test:link_id>
  <test:user>SLAYERTANIC</test:user>
  <title>aaa</title>
  <description>aaa</description>
</item>

Имея это, вы можете использовать XNamespace для определения требуемого элемента XML с правильным пространством имен:

XElement xdoc = XElement.Parse(e.Result);
XNamespace test = "http://foo.bar";
this.newsList.ItemsSource = from item in xdoc.Descendants("item")
                            select new ArticlesItem
                            {
                                LinkID = item.Element(test + "link_id").Value,
                                Title = item.Element("title").Value,
                                Description = this.Strip(item.Element("description").Value).Substring(0, 200).ToString()
                            }
4 голосов
/ 08 июня 2011

Чтобы написать запрос к XML, который находится в пространстве имен, вы должны использовать объекты XName, которые имеют правильное пространство имен.Для C # наиболее распространенным подходом является инициализация XNamespace с использованием строки, содержащей URI, а затем использование перегрузки оператора сложения для объединения пространства имен с локальным именем.

Для получения значенияЭлемент link_id вам нужно будет объявить и использовать пространство имен XML для элемента test: link .

Поскольку вы не указали объявление пространства имен в своем примере XML,Я собираюсь предположить, что это объявлено где-то еще в XML-документе.Вам нужно найти объявление пространства имен в XML (что-то вроде xmlns: test = "http://schema.example.org"), которое часто объявляется в корне XML-документа.

После того, как вы это знаете, вы можете сделать следующеечтобы получить значение элемента link_id:

XElement xdoc = XElement.Parse(e.Result);

XNamespace testNamespace = "http://schema.example.org";

this.newsList.ItemsSource = from item in xdoc.Descendants("item")
  select new ArticlesItem
  {
    Title       = item.Element("title").Value,
    Link        = item.Element(testNamespace + "link_id").Value,
    Description = this.Strip(item.Element("description").Value).Substring(0, 200).ToString()                            
  }

См. XNamespace и Пространства имен в C # и Как написать запросы в XML вПространства имен для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...