2011-05-05 4 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 
} 

너무 여기

은이 문제에 대한 자원이다 예를 들어 네임 스페이스 (XNamespa ce),하지만 LINQ 문을 사용하여 개체를 채울 때 짧은 빠지게 오전. LINQ의 모양이 위의 게시와 같은 XML이있을 때 객체의 속성에 값을 선택 할 수 있도록 무엇

// (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]  
    ..... 
} 

:

는 내가 뭔가를 할 필요가 있다고 생각? 헤더의 TransactionID 값과 DeliverReq 값 아래에있는 값은 XML의 두 부분으로 나누어 져 있습니다. 그것들이 퍼져 있다는 것은 이상한 일이며, 단순히 DeliverReq 키로 값을 선택하는 것보다 혼란 스럽습니다. FROM 부분을보고 XML의 값으로 채워진 속성 중 2 ~ 3 개가 있으면 거기에서 가져올 수 있습니다.

설명이 필요하면 알려주십시오. 내 주요 문제는 LINQ의 "FROM"부분과 TransactionId가 DeliverReq 태그 외부에 있다는 사실을 처리하는 방법입니다. Sender와 Recipients 태그 아래에 값을 중첩하는 것과 같은 다른 경우를 처리 할 수 ​​있다고 생각합니다.

답변

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. 그게 제가 찾고 있던 것입니다 - 당신이 말했듯이, 나는 List <> 객체를 채우는 것이 아니라 오히려 단 하나의 것을 채우고 있습니다. 당신의 대답에 대한 핵심은 두 가지입니다 : LINQ 문을 "보낸 사람"으로 사용하지 않고 "단일"확장 프로그램을 사용하지 않았습니다. 정말 고맙습니다. 나는 많은 것을 배웠다! –

+0

또한이 필드 중 일부는 선택 사항이므로 "Single"대신 "SingleOrDefault"를 사용하는 것처럼 보입니다. –

+0

@ D-Sect yes - 옵션 일 경우'SingleOrDefault()'를 사용하십시오. – BrokenGlass