使用XDocument搜索和提取数据

时间:2010-11-22 17:13:08

标签: c# linq-to-xml

我从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,即 选择Address(作为字符串)LetterQueueOID = 2。

我所知道的是我可以使用XDocument,但我无法弄清楚如何得到我想要的东西:

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

2 个答案:

答案 0 :(得分:3)

使用Where扩展方法尝试lambda表达式。在这里我得到了id为2的地址,就像一个例子

XDocument addresses = XDocument.Parse((string)returnScalar);
var address = addresses.Root.Elements("Address").Where(address => address.Element("LetterQueueOID").Value == "2").FirstOrDefault();

答案 1 :(得分:1)

嗯,你可以这样做:

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 */);