2014-10-17 30 views
2

我發現了很多不同的如何解析XML文件的例子,而且大多數都讓我成爲那裏的一部分,但是我找不到一個能夠滿足我需要的例子。解析XML響應並返回對象集合

給出下面的XML響應

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <ParentNode xmlns="http://my.own.namespace.com/"> 
     <ChildNode> 
     <Value1>string<Value1> 
     <Value2>string<Value2> 
     </ChildNode> 
     <ChildNode> 
     <Value1>string<Value1> 
     <Value2>string<Value2> 
     </ChildNode> 
    </ParentNode> 
    </soap:Body> 
</soap:Envelope> 

如何返回填充了值1和值2的值ChildNode對象的集合?

到目前爲止,我已經得到了最遠的是讓所有的值1字符串列表,像這樣

var soap = XDocument.Parse(response); 
XNamespace ns = XNamespace.Get("http://my.own.namespace.com/"); 

var objectList = soap.Decendents(ns + "ParentNode"); 
    .Select(x => x.Elements().First.Value).ToList(); 

我也嘗試使用XSD工具,但是這給了那個http://my.own.namespace.com/:ParentNode未能發現錯誤。

感謝您的幫助,我敢肯定,這是解決

+0

嘗試soap.Decendents(NS + 「// ParentNode」); 「//」選擇該類型的所有後代節點 – Oscar 2014-10-17 11:34:31

+0

您應該使用WCF(System.ServiceModel)而不是直接使用XmlDocument解析XML(在System.Xml.Linq中) – 2014-10-17 11:34:48

+0

應該指出這是在WinRT中univeral應用程序不支持服務參考 – lookitskris 2014-10-17 11:42:41

回答

0

嘗試這種方式很容易的問題:

XNamespace ns = XNamespace.Get("http://my.own.namespace.com/"); 

var objectList = soap.Decendents(ns + "ParentNode"); 
        .Select(x => new ChildNode 
            { 
            Value1 = (string)x.Element(ns+"Value1"), 
            Value2 = (string)x.Element(ns+"Value2"), 
            } 
          ) 
         .ToList(); 

我假設你有一個包含string類型的兩個屬性ChildNode類中定義:Value1Value2

+0

必須將字符串x.Elements(ns +「Value1」)更改爲(字符串)x.Element(ns +「Value1」)。值現在正在工作。謝謝! – lookitskris 2014-10-17 12:10:56

+0

@lookitskris你說得對'元素'應該是'元素',我在發佈答案後立即修復了這部分內容(儘管如此,不需要使用'.Value') – har07 2014-10-17 12:35:36

0

它的工作原理:

XNamespace ns1 = XNamespace.Get("http://my.own.namespace.com/"); 

var values = from childnode in xx.Descendants(ns1 + "ParentNode").Elements(ns1 + "ChildNode") 
          select new 
          { 
           Value1 = (string)childnode.Element(ns1 + "Value1"), 
           Value2 = (string)childnode.Element(ns1 + "Value2"), 
          };