【问题标题】:Linq to XML query problemLinq to XML 查询问题
【发布时间】:2011-07-08 16:43:21
【问题描述】:

这是我的 XML:

<?xml version="1.0" ?> 
<AddressValidateResponse>
  <Address ID="0">
    <FirmName>FIRM NAME, INC</FirmName> 
    <Address2>123 MAIN ST</Address2> 
    <City>SOME PLACE</City> 
    <State>CA</State> 
    <Zip5>90028</Zip5> 
    <Zip4>1467</Zip4> 
  </Address>
  <Address ID="1">
    <Error>
      <Number>-2147219401</Number> 
      <Source>SOURCE INFO HERE</Source> 
      <Description>Address Not Found.</Description> 
      <HelpFile /> 
      <HelpContext>1000440</HelpContext> 
    </Error>
  </Address>
  <Address ID="2">
    <FirmName>FIRM NAME, INC</FirmName> 
    <Address2>123 MAIN ST</Address2> 
    <City>SOME PLACE</City> 
    <State>CA</State> 
    <Zip5>90028</Zip5> 
    <Zip4>1467</Zip4> 
  </Address>
  <Address ID="3">
     <FirmName>FIRM NAME, INC</FirmName> 
     <Address2>123 MAIN ST</Address2> 
     <City>SOME PLACE</City> 
     <State>CA</State> 
     <Zip5>90028</Zip5> 
     <Zip4>1467</Zip4> 
  </Address>
  <Address ID="4">
    <Error>
      <Number>-2147219401</Number> 
      <Source>SOURCE INFO HERE</Source> 
      <Description>Address Not Found.</Description> 
      <HelpFile /> 
      <HelpContext>1000440</HelpContext> 
    </Error>
  </Address>
</AddressValidateResponse>

我需要创建两个列表。一个具有有效地址,一个具有错误块。在上面的示例中,第一个列表将包含 3 个地址,第二个列表将包含两个。不确定如何正确过滤查询。谢谢。

我能够让它与以下内容一起工作,但我怀疑有一种更有效的方法来做同样的事情:

    var errors = from d in xDoc.Descendants("Address")
                         from e in d.Elements("Error")
                         where e.Element("Description").Value.Trim().ToUpper().Contains("ADDRESS NOT FOUND")
                         select new AddressObject
                         {
                             Order = (int)d.Attribute("ID"),
                             StreetAddress = "NO MATCH FOUND",
                             OtherAddress = String.Empty,
                             City = String.Empty,
                             State = String.Empty,
                             ZipCode = String.Empty,
                             ZipPlus4 = String.Empty
                         };

            errorList = errors.ToList();

    var addresses = from a in xDoc.Descendants("Address")
                        from b in a.Elements("FirmName")
                        where b.Value != String.Empty
                        select new AddressObject
                        {
                            Order = (int)a.Attribute("ID"),
                            StreetAddress = (string)a.Element("Address2") ?? String.Empty,
                            OtherAddress = (string)a.Element("Address1") ?? String.Empty,
                            City = (string)a.Element("City") ?? String.Empty,
                            State = (string)a.Element("State") ?? String.Empty,
                            ZipCode = (string)a.Element("Zip5") ?? String.Empty,
                            ZipPlus4 = (string)a.Element("Zip4") ?? String.Empty
                        };

    validList = addressess.ToList();

【问题讨论】:

  • 我在上面的编辑中使用 c#

标签: linq-to-xml


【解决方案1】:

您可以尝试这样的方法 - 似乎应该有更有效的方法,但我现在无法弄清楚...

string xmlContent = @"<?xml version=""1.0"" ?> 
<AddressValidateResponse>
  <Address ID=""0"">
    <FirmName>FIRM NAME, INC</FirmName> 
    <Address2>123 MAIN ST</Address2> 
    <City>SOME PLACE</City> 
    <State>CA</State> 
    <Zip5>90028</Zip5> 
    <Zip4>1467</Zip4> 
  </Address>
  <Address ID=""1"">
    <Error>
      <Number>-2147219401</Number> 
      <Source>SOURCE INFO HERE</Source> 
      <Description>Address Not Found.</Description> 
      <HelpFile /> 
      <HelpContext>1000440</HelpContext> 
    </Error>
  </Address>
  <Address ID=""2"">
    <FirmName>FIRM NAME, INC</FirmName> 
    <Address2>123 MAIN ST</Address2> 
    <City>SOME PLACE</City> 
    <State>CA</State> 
    <Zip5>90028</Zip5> 
    <Zip4>1467</Zip4> 
  </Address>
  <Address ID=""3"">
     <FirmName>FIRM NAME, INC</FirmName> 
     <Address2>123 MAIN ST</Address2> 
     <City>SOME PLACE</City> 
     <State>CA</State> 
     <Zip5>90028</Zip5> 
     <Zip4>1467</Zip4> 
  </Address>
  <Address ID=""4"">
    <Error>
      <Number>-2147219401</Number> 
      <Source>SOURCE INFO HERE</Source> 
      <Description>Address Not Found.</Description> 
      <HelpFile /> 
      <HelpContext>1000440</HelpContext> 
    </Error>
  </Address>
</AddressValidateResponse>";

XDocument doc = XDocument.Parse(xmlContent);

var errors = doc.Descendants("Address").Where(a => a.Descendants("Error").Count() > 0).ToList();
var real = doc.Descendants("Address").Where(a => a.Descendants("Error").Count() == 0).ToList();

基本上,您检查每个&lt;Address&gt; XElement 包含多少名称为Error 的子元素 - 0 表示“真实”地址,> 0 表示错误条目。

【讨论】:

  • 谢谢,我能够调整您的建议并完成同样的事情。
猜你喜欢
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多