使用 LINQ 和 XDocument 获得 children of XML

Get children of XML using LINQ and XDocument

我可以解析一个 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>test@dev.com</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# 来说仍然很新,我们深表歉意

您的 EnvelopeStatus 有一个默认命名空间,因此每个元素都必须以它为前缀。您可以获取第一个 RecipientStatusCustomFields 中第一个元素的值,例如:

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;