Проверка существования узла в Linq to XML - PullRequest
1 голос
/ 05 августа 2011

У меня есть серия XML-файлов, которые я перевожу в папке. Они почти всегда одинаковы, но время от времени я сталкиваюсь с файлом, который не содержит элемент, который содержат другие. Например, в одном файле это будет выглядеть так:

<sb_sbgp>
  <itemtitle>French-Canadian</itemtitle>
  <itemtype>subscription</itemtype>
  <audience>French people</audience>
</sb_sbgp>

но следующий файл может выглядеть так:

<sb_sbgp>
  <itemtitle>Spanish</itemtitle>
  <itemtype>subscription</itemtype>
</sb_sbgp>

Моя проблема в том, что я не могу просто извлечь те файлы, которые содержат элемент аудитории (что позволило бы мне добавить предложение where). В идеале, я бы хотел, чтобы по умолчанию было null , если оно не существует. Вот запрос, который я использую, чтобы попытаться выполнить это:

XDocument doc = XDocument.Load(mydoc.xml);
var x = (from node in doc.Descendants("sb_sbgp")
         select new
         {
             title = node.Element("itemtitle").Value,
             type = node.Element("itemtype").Value,
             audience = string.IsNullOrEmpty(node.Element("sb_sbgp_audience").Value) ? node.Element("sb_sbgp_audience").Value : null
         });

Я понимаю, что это тестирование, чтобы увидеть, есть ли значение, а не элемент, но я не могу найти ничего, что позволило бы мне проверить существование элемента. Помощь

Ответы [ 4 ]

3 голосов
/ 05 августа 2011

Вам повезло - на самом деле это действительно легко сделать:)

Вместо использования .Value, просто приведение к string и LINQ to XML будет делать то, чтоВы хотите:

audience = (string) node.Element("sb_sbgp_audience")

Если вы приведете нулевую XElement или XAttribute ссылку к любому типу, допускающему значение NULL (тип ссылки или тип значения NULL), вы получите нулевой результат.Очень удобно.

Единственным недостатком этого является то, что если есть пустой элемент, вы все равно получите пустую строку вместо пустой ссылки.Если вы действительно хотите этого избежать, я предлагаю создать такой метод расширения:

public static string ToNullIfEmpty(this string text)
{
    return string.IsNullOrEmpty(text) ? null : text;
}

, тогда вы можете использовать:

audience = ((string) node.Element("sb_sbgp_audience")).ToNullIfEmpty()
3 голосов
/ 05 августа 2011

попробовать ...

XDocument doc = XDocument.Load("");
var x = (from node in doc.Descendants("sb_sbgp")
     select new
     {
         title = node.Element("itemtitle").Value,
         type = node.Element("itemtype").Value,
         audience = (node.Element("sb_sbgp_audience") != null) ? node.Element("sb_sbgp_audience").Value : null
     });
1 голос
/ 05 августа 2011

Как насчет этого:

audience = node.Elements("sb_sbgp_audience").Count() > 0 ? node.Element("sb_sbgp_audience").Value : null
1 голос
/ 05 августа 2011

Как насчет этого?

XDocument doc = XDocument.Load(mydoc.xml);
var x = (from node in doc.Descendants("sb_sbgp")
         select new
         {
             title = node.Element("itemtitle").Value,
             type = node.Element("itemtype").Value,
             audience = node.Element("audience") != null) ? node.Element("audience").Value : null
         });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...