LINQ to XML—将嵌套名称空间中的值提取到对象中

本文关键字:提取 对象 空间 XML to 嵌套 LINQ | 更新日期: 2023-09-27 17:55:02

我想使用LINQ to XML从嵌套命名空间的XML文档中提取值。

我的问题已经被另一个SO用户部分地回答了:LINQ to XML w/嵌套命名空间

我仍然有麻烦试图找出如何选择值到对象的属性。

下面是这个问题的资源:

示例XML文件链接

以上链接内容:

<?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]     
    .....
}

LINQ的形状是什么,能够选择值到一个对象的属性,当你有像上面发布的XML ?我关心XML的两个部分中的数据:header中的TransactionID值,以及DeliverReq下的值。奇怪的是,它们被分散开来,这比简单地从DeliverReq键中严格选择值更令人困惑。如果我看到FROM部分,并且2到3个属性填充了来自XML的值,那么我就可以从那里拾取它。

如果你需要任何解释,请告诉我。我的主要问题是LINQ的"FROM"部分,以及如何处理TransactionId在DeliverReq标签之外的事实。我认为我可以处理其他情况,例如在Sender和收件人标签下的值上嵌套。

LINQ to XML—将嵌套名称空间中的值提取到对象中

由于在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};