2011-08-16 23 views
0

これは簡単なはずですが、LINQを使ってXMLにナビゲートするのは難しいことです(私はが私を台無しにしていると思います)。数字は<addressData>です。最終的には、各<addressData>要素内の各要素の値を読み取る必要があります。LinqからXMLへのナビゲーションの問題

XML:

<soapenv:Body> 
<getAddrResponse xmlns="http://urlhere.com/v1"> 
    <AddrResponse> 
     <requestorId>123456</requestorId> 
     <address> 
      <addressCount>3</addressCount> 
      <addressData> 
       <addressLine1>123 MAIN ST</addressLine1> 
       <cityName>HOLLYWOOD</cityName> 
       <stateCode>CA</stateCode> 
       <zipCode>90028</zipCode> 
       <zipPlus4Code>1234</zipPlus4Code> 
      </addressData> 
      <addressData> 
       <addressLine1>456 MAIN ST</addressLine1> 
       <cityName>HOLLYWOOD</cityName> 
       <stateCode>CA</stateCode> 
       <zipCode>90028</zipCode> 
       <zipPlus4Code>1234</zipPlus4Code> 
      </addressData> 
      <addressData> 
       <addressLine1>789 MAIN ST</addressLine1> 
       <cityName>HOLLYWOOD</cityName> 
       <stateCode>CA</stateCode> 
       <zipCode>90028</zipCode> 
       <zipPlus4Code>1234</zipPlus4Code> 
      </addressData> 
     </address> 
    </AddrResponse> 
</getAddrResponse> 
</soapenv:Body> 

答えて

0

あなたのXMLは現在、違法である:あなたの外側の名前空間が定義されていません。

XDocument doc = XDocument.Load("test.xml"); 
XNamespace someNamespace = "http://urlhere.com/v1"; 
int addressCount = doc.Descendants(someNamespace + "addressData").Count(); 
1

あなたはsoapenvを宣言するなど、アカウントに名前空間と名前空間接頭辞を取る必要があります。

var xml = "<soapenv:Body xmlns:soapenv=\"" 
      +"http://www.w3.org/2001/12/soap-envelope\">...</soapenv:Body>"; 
var doc = XDocument.Parse(xml); 
XNamespace ns = "http://urlhere.com/v1"; 

var addressDatas = doc.Root.Descendants(ns+"addressData"); 

var count = addressDatas.Count(); 

var firstAddressLine = addressDatas.First().Element(ns+"addressLine1").Value; 
+0

Thxを:だからあなたのXMLを仮定すると、本当に

<soapenv:Body xmlns:soapenv="foo.com"> ... 

のようであるあなたは、このようなaddressDataカウントを取得することができます。私は最初に他の応答を見て、それは働いた。あなたのアプローチもうまくいくように見えます。それは私を捨てていた名前空間の問題でした。 – Earl