我想使用LINQ to XML从具有嵌套命名空间的XML文档中提取值。
另一位SO用户部分回答了我的问题:LINQ to XML w/ nested namespaces
我仍然无法弄清楚如何在对象的属性中选择值。
以下是此问题的资源:
以上链接的内容:
<?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示例帮助我理解了添加命名空间(XNamespace)的必要性,但是当我尝试使用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]
.....
}
当您拥有上面发布的XML时,能够在对象的属性中选择值的LINQ的形状是什么? 我关心XML的两个部分中的数据:标头中的 TransactionID 值,以及 DeliverReq 下的值。奇怪的是,它们被分散开来,而不仅仅是简单地从 DeliverReq 键中选择值,这更令人困惑。如果我看到了FROM部分,并且有2到3个属性填充了XML中的值,那么我就可以从那里获取它。
如果您需要任何说明,请告诉我。我的主要问题是LINQ的“FROM”部分以及如何处理TransactionId在DeliverReq标记之外的事实。我想我可以处理其他情况,例如在Sender和Recipients标签下的值上嵌套。
答案 0 :(得分: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};