簡體   English   中英

使用 LINQ 和 XDocument 獲取 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)。

我已經接近嘗試了我在這張照片中得到的東西,但必須有一種更有效的方法來做到這一點,如果它對 LINQ 和 C# 來說仍然非常新,我深表歉意

<EnvelopeStatus xmlns="http://www.docusign.net/API/3.0">

您的根元素有一個默認命名空間,因此每個元素都必須使用它進行限定,除非您覆蓋它,而您從未這樣做過。 我看到您的示例代碼試圖繞過命名空間。 不要那樣做,它會使你的代碼變慢而且不准確。

幸運的是,.NET 帶有一個XNamespace class,它覆蓋字符串分配以創建命名空間實例,並覆蓋字符串連接以創建命名空間限定的 XName 實例。

您可以使用它們來獲取第一個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;

如果您想獲得第一個RecipientStatusCustomField以外的內容,則必須修改代碼。

避免使用Descendants替換所有這些代碼的誘惑; 這樣做也會使您的代碼變慢且不准確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM