【问题标题】:LINQ to XML - Extracting values inside nested namespaces into an objectLINQ to XML - 将嵌套命名空间内的值提取到对象中
【发布时间】:2011-08-19 00:28:30
【问题描述】:

我想使用 LINQ to XML 从具有嵌套命名空间的 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 示例帮助我理解了添加命名空间 (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 的 2 个部分中的数据:标头中的 TransactionID 值,以及 DeliverReq 下的值。奇怪的是,它们被分散开来,这比简单地从 DeliverReq 键中严格选择值更令人困惑。如果我看到 FROM 部分,并且有 2 到 3 个属性填充了 XML 中的值,那么我就可以从那里获取它。

如果您需要任何说明,请告诉我。我的主要问题是 LINQ 的“FROM”部分以及如何处理 TransactionId 在 DeliverReq 标记之外的事实。我想我可以处理其他情况,例如嵌套在 Sender 和 Recipients 标签下的值。

【问题讨论】:

    标签: c# xml .net-3.5 linq-to-xml xml-namespaces


    【解决方案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};
    

    【讨论】:

    • 谢谢你,BG。这就是我一直在寻找的 - 正如你所说,我不是在填充 List 对象,而是一个单一的对象。关于您的答案,有两件事是关键:不使用带有“from”的 LINQ 语句和使用我从未接触过的“Single”扩展名。太感谢了。我学到了很多东西!
    • 我还想补充一点,看起来我将使用“SingleOrDefault”而不是“Single”,因为其中一些字段是可选的。
    • @D-Sect 是的 - 如果它们是可选的,请使用 SingleOrDefault()
    猜你喜欢
    • 2018-05-21
    • 1970-01-01
    • 2021-09-10
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多