Использование XDocument для поиска и извлечения данных - PullRequest
1 голос
/ 22 ноября 2010

Я возвращаю обратно из sql строку XML с несколькими адресами, вот пример того, что возвращается:

<Addresses>
  <Address>
    <LetterQueueOID>2</LetterQueueOID>
    <Address1>115 MORNINGVIEW TRL</Address1>
    <Address2>SCARBOROUGH, </Address2>
    <Address3>M1B5L2</Address3>
    <City>SCARBOROUGH</City>
    <PostalCode>M1B5L2</PostalCode>
  </Address>
  <Address>
    <LetterQueueOID>1</LetterQueueOID>
    <Address1>GD PO BOX 685</Address1>
    <Address2>THORNBURY, ON</Address2>
    <Address3>N0H2P0</Address3>
    <City>THORNBURY</City>
    <ProvinceOrState>ON</ProvinceOrState>
    <CountryCode>Ca</CountryCode>
    <PostalCode>N0H2P0</PostalCode>
  </Address>
</Addresses>

Я хочу использовать LINQ, чтобы запросить эту строку XML для конкретных буквенных идентификаторов, т.е. Выберите адрес (в виде строки), где LetterQueueOID = 2.

Все, что я понял, это то, что я могу использовать XDocument, но я не могу понять, как именно получить то, что хочу:

XDocument addresses = XDocument.Parse((string)returnScalar);
IEnumerable<XElement> items = addresses.Root.Elements("Address").ToList();

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

попробуйте лямбда-выражение с помощью метода расширения Where.здесь я получаю адрес с идентификатором 2, просто в качестве примера

XDocument addresses = XDocument.Parse((string)returnScalar);
var address = addresses.Root.Elements("Address").Where(address => address.Element("LetterQueueOID").Value == "2").FirstOrDefault();
1 голос
/ 22 ноября 2010

Ну, вы можете сделать:

var matches = addresses
                 .Root
                 .Elements("Address")
                 .Where(addr => (string) addr.Element("LetterQueueOID") == "2")

Однако, вы получите все соответствующие элементы <Address>. Вы говорите, что хотите вернуть адрес в виде строки - но в каком формате?

Вы можете объединить строки следующим образом:

var matches = addresses
                 .Root
                 .Elements("Address")
                 .Where(addr => (string) addr.Element("LetterQueueOID") == "2")
                 .Select(addr => (string) addr.Element("Address1") + " "
                                 (string) addr.Element("Address2") + " "
                                 /* etc */);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...