使用 LINQ 和 XDocument 获取 XML 的子级

问题描述 投票:0回答:1

我可以解析 XML 并从中获取这个特定的块,如下所示:

var document = XDocument.Parse(xml);

            var envelopeStatusElement = document.Root
                .Elements()
                .SingleOrDefault(e => e.Name.LocalName == "EnvelopeStatus");

信封状态元素:

<EnvelopeStatus xmlns="http://www.docusign.net/API/3.0">
  <RecipientStatuses>
    <RecipientStatus>
      <Type>Signer</Type>
      <Email>[email protected]</Email>
      <Status>Sent</Status>
      <RecipientIPAddress />
      
      <CustomFields>
        <CustomField>123</CustomField>
      </CustomFields>
      
    </RecipientStatus>
  </RecipientStatuses>
  <EnvelopeID>123456789</EnvelopeID>
  <CustomFields>
    <CustomField>
      <Name>templateUsageRestriction</Name>
      <Show>False</Show>
      <Required>False</Required>
      <Value>allOptions</Value>
    </CustomField>
    
    <CustomField>
      <Name>mailingListId</Name>
      <Show>False</Show>
      <Required>False</Required>
      <Value>987</Value>
    </CustomField>
    
  </CustomFields>
</EnvelopeStatus>

我很难获取 RecipientStatus(123) 中 CustomField 的值以及 CustomFields 中 CustomField 的值,但名称为 mailingListId(987)。

我已经接近尝试了 this pic 中的内容,但必须有一种更有效的方法来做到这一点,如果它的超级明显对 LINQ 和 C# 来说仍然很新,我深表歉意

c# .net linq-to-xml
1个回答
0
投票
<EnvelopeStatus xmlns="http://www.docusign.net/API/3.0">

你的根元素有一个默认的命名空间,所以每个元素都必须用它限定,除非你重写它,而你从未这样做过。我看到您的示例代码经过了一些扭曲,试图绕过名称空间。不要这样做,它会让你的代码变得缓慢且不准确。

幸运的是,.NET 附带了一个

XNamespace
类,它可以重写字符串赋值来创建命名空间实例,并重写字符串连接来创建命名空间限定的 XName 实例。

您可以使用它们来获取第一个

CustomFields
中第一个元素的值,如下所示:
RecipientStatus

如果您想获得第一个 
XNamespace ns = "http://www.docusign.net/API/3.0"; var firstStatusFirstCustomFieldValue = document.Element(ns + "EnvelopeStatus") .Element(ns + "RecipientStatuses") .Elements(ns + "RecipientStatus") .First() .Element(ns + "CustomFields") .Elements(ns + "CustomField") .First().Value;

First
之外的其他内容,则必须修改
RecipientStatus
方法参数。
抵制使用 

CustomField

替换所有这些代码的诱惑;这样做也会使您的代码变得缓慢且不准确。

    

© www.soinside.com 2019 - 2024. All rights reserved.