2011-07-08 146 views
1

這裏是我的XML:的LINQ to 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(); 
+0

我使用c#以上我編輯 – Earl

回答

2

你可以嘗試這樣的事情 - 似乎,就必須有一個更有效的方式,但我想不出它現在...

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(); 

基本上,你檢查每個<Address>的XElement多少子元素與Error名稱包含 - 0表示「真正的「地址,> 0表示錯誤條目。

+0

謝謝,我能夠調整您的建議,並完成相同的事情。 – Earl