2011-05-05 76 views
0

我想使用LINQ to XML從嵌套命名空間的XML文檔中提取值。LINQ to XML - 將嵌套命名空間中的值提取到對象中

我的問題已經部分回答了另一個SO用戶:LINQ to XML w/ nested namespaces

我仍然有麻煩試圖找出如何選擇值到一個對象的屬性。

下面是這個問題的資源:上面的鏈接的

Sample XML File Link

內容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns1:Envelope xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ns3="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-6-MM7-1-4"> 
<ns1:Header> 
    <ns3:TransactionID ns1:mustUnderstand="1">XXXX-XXXX-XXXX-XXXX</ns3:TransactionID> 
</ns1:Header> 
<ns1:Body> 
<ns3:DeliverReq> 
    <ns3:MM7Version>6.8.0</ns3:MM7Version> 
    <ns3:LinkedID>LINKED-ID-IS-HERE</ns3:LinkedID> 
    <ns3:Sender> 
     <ns3:Number>3025551212</ns3:Number> 
    </ns3:Sender> 
    <ns3:Recipients> 
     <ns3:To> 
      <ns3:Number displayOnly="false">11111</ns3:Number> 
     </ns3:To> 
    </ns3:Recipients> 
    <ns3:TimeStamp>2011-04-25T10:28:40.000Z</ns3:TimeStamp> 
    <ns3:UACapabilities UAProf="motok1c"/> 
    <ns3:Content allowAdaptations="true" href="cid:default.cid"/> 
</ns3:DeliverReq> 
</ns1:Body> 
</ns1:Envelope> 

對象從這個XML填寫:

public class TestClass 
{ 
    public string TransactionId { get; set; } 
    public string MessageType { get; set; } 
    public string Mm7Version { get; set; } 
    public string VaspId { get; set; } 
    public string VasId { get; set; } 
    public string Sender { get; set; } 
    public string Recipients { get; set; } 
    public string LinkedId { get; set; } 
    public string TimeStamp { get; set; } 
    public string Priority { get; set; } 
    public string Subject { get; set; } 
    public string Content { get; set; } 
    public string UaCapabilities { get; set; } 

    // not all properties appear in every XML message received 
} 

的SO示例幫助我理解需要添加一個名稱空間(XNamespa ce),但是當我嘗試使用LINQ語句填充對象時,我陷入了一片空白。

我想我需要做一些事情,如:

// (don't know the "from" in this case - decendants? 
// which XML key/node?) 
select new TestClass 
{ 
    TransactionId = [LINQ to select the "TransactionID" value that 
     appears under the Header key] 
    Mm7Version = [LINQ to select the "MM7Version" value, under the 
     DeliverReq key]  
    ..... 
} 

什麼是LINQ的形狀可以,當你有像XML張貼以上選擇的值到一個對象的屬性? 我關心XML的兩部分中的數據:標題中的值爲TransactionID,以及值低於DeliverReq。奇怪的是,它們被分散開來,並且比簡單地從DeliverReq密鑰中嚴格選擇值更混亂。如果我看到了FROM部分,並且從XML中填充了2到3個屬性值,那麼我可以從那裏拾取它。

如果您需要任何澄清,請讓我知道。我的主要問題是LINQ的「FROM」部分,以及如何處理TransactionId超出DeliverReq標記的事實。我想我可以處理其他情況,例如嵌套在發件人和收件人標籤下的值。

回答

1

由於只有在你的XML你TestClass實例中的一個屬性,併爲那些遍佈很有意義手動選擇它們,然後創建實例的地方的價值觀:

XDocument doc = XDocument.Load(@"test.xml"); 
XNamespace ns3 = "http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-6-MM7-1-4"; 

string transactionId = doc.Descendants(ns3 + "TransactionID").Single().Value; 
string mm7Version = doc.Descendants(ns3 + "MM7Version").Single().Value; 
//...select the other elements 

TestClass testClass = new TestClass() { TransactionId = transactionId, 
             Mm7Version = mm7Version}; 
+0

謝謝,BG。那正是我所尋找的 - 正如你所說的,我沒有填充物品的列表,而是單一的物品。關於你的答案,有兩件事是關鍵的:不使用帶有「from」的LINQ語句和使用我從未接觸過的「Single」擴展。非常感謝。我學到了很多! – 2011-05-05 11:22:59

+0

我還想補充一點,它看起來像我將使用「SingleOrDefault」而不是「Single」,因爲其中一些字段是可選的。 – 2011-05-05 11:39:43

+0

@ D-Sect是 - 如果它們是可選的,使用'SingleOrDefault()' – BrokenGlass 2011-05-05 12:53:16