Как мне вернуть XElement с LINQ to XML? - PullRequest
0 голосов
/ 16 марта 2011

Я имитирую веб-сервис, который возвращает XElement. Сервис делает свой XElement из базы данных. Чтобы иметь локальную тестовую службу, я создал XML-документ, который имитирует список XML-элементов. Я хочу выбрать и вернуть один из них через LINQ to XML.

Итак, у меня есть документ XML:

<?xml version="1.0" encoding="utf-8" ?>
<customers>
    <customer ordercode="GCT/12345A">
        <title>Miss</title>
        <initials>A</initials>
        <surname>Customer</surname>
        ...
    </customer>
    <customer ordercode="GCT/12346A">
        <title>Mrs</title>
        <initials>AN</initials>
        <surname>Other</surname>
        ...
    </customer>
</customers>

И используя LINQ, я хотел бы выбрать один из элементов Customer по атрибуту кода заказа. Мне просто нужно отключить InnerXML клиентского узла и вернуть его. Я попытался разобрать так:

XElement xcust = (XElement)(from c in xdocument.Descendants("customer")
                 where c.Attribute("ordercode") == strorder
                 return c).Single();

но это не сработало. Я также попробовал:

return new XElement("customer", [same LINQ Query]);

Полагаю, мне нужно как-то опросить запрос для InnerXML выбранного клиента, но я не уверен, как это сделать. Поскольку большинство людей просто разбирают XML прямо в требуемые объекты (что, поскольку я имитирую ответ от удаленного сервиса, я не могу сделать), я не могу найти много информации, просто возвращая необработанный элемент, так как я предполагаю, что немного использования крайнего случая.

Ответы [ 3 ]

5 голосов
/ 16 марта 2011

Вам необходимо проверить свойство Value атрибута:

XElement xcust = (XElement)(from c in doc.Descendants("customer")
                 where c.Attribute("ordercode").Value == strorder
                 select c).Single();

Вы также можете опустить приведение к XElement.

0 голосов
/ 16 марта 2011

Попробуйте:

var res = (from c in xdocument.Element("customers").Elements()
           let attr = c.Attribute("ordercode") 
           where attr != null && attr.Value == strorder
           select c).Single();
0 голосов
/ 16 марта 2011

Конечно, я был глуп:

where c.Attribute("ordercode") == strorder

Должно быть:

where c.Attribute("ordercode").Value.ToString() == strorder.

Тогда оно не пропускается.

...