Фильтрация документа по атрибутам элемента с использованием LINQ to XML - PullRequest
1 голос
/ 07 февраля 2011

У меня есть этот документ XML:

<?xml version="1.0" encoding="UTF-8"?>
<teryt>
<catalog name="TERC" type="all" date="2010-01-01">
<row>
  <field name="Woj">1</field>
  <field name="City">Warszawa</field>
  <field name="Name">Mazowsze</field>
</row>
<row>
  <field name="WojId">1</field>
  <field name="City"/>
  <field name="Name">Mazowsze</field>
</row>
<row>
  <field name="Woj">2</field>
  <field name="City"/>
  <field name="Name">Slask</field>
</row>
</catalog>
</teryt>

И теперь я хочу получить только строки, которые не имеют значения в поле с атрибутом City (используя LINQ to XML).

Ответы [ 3 ]

3 голосов
/ 07 февраля 2011

Вы имеете в виду что-то вроде:

var rows = from row in doc.Root.Elements("rows")
           where !row.Elements("field")
                     .Any(x => (string) x.Attribute("name") == "City"
                               && x.Value != "")
           select row;

Там написано "найти все строки, в которых нет непустых элементов field с атрибутом name City". Я думаю это то, что вы ищете ...

1 голос
/ 07 февраля 2011

Как только вы загрузите свой XML-документ в объект XDocument, вы сможете получить доступ к его тегам. Поэтому вам нужно взять элемент Root вашего XDocument и перейти к тегам строк с помощью метода Elements. И когда у вас есть все ваши метки в коллекции, вы можете сортировать те, у которых нет поля города. Я почти уверен, что в элементах xml есть свойство HasValue, которое сообщает вам, имеет ли оно значение или нет. Но если его нет, вы можете проверить свойство Value, которое будет пустым или пустым.

Итак, немного кода для этого, как мне нравится:

XDocument doc = XDocument.Load("yourfile");
var tags = doc.Root.Element("catalog")
                   .Elements("row")
                   .Where(r=>r.Elements("field")
                       .Single(f=>f.Attribute("name").Value == "City" 
                             && string.IsNullOrWhitespace(f.Value)));

Это переводится примерно так: Возьмите документ, выберите корень документа, возьмите элемент с именем «catalog» и дайте мне все элементы «row», где это правда, что если Аргумент «row» имеет элемент «field» с атрибутом «name», установленным в «City», это ноль, пустая строка или пробел.

Теперь это может быть не так легко понять, если вы новичок в этом, но я бы так поступил. Вы можете добавить несколько нулевых проверок, но теперь это зависит от вас.

1 голос
/ 07 февраля 2011

Что-то вроде:

var query = from row in xdoc.Descendants("row")
            where row.Elements("field")
                     .Any(ff => ff.Attribute("name").Value == "City"
                             && String.IsNullOrWhitespace(ff.Value))
            select row;

Это основано на желании найти каждую строку без значения City.

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