[英]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 實例。
您可以使用它們來獲取第一個RecipientStatus
內CustomFields
內第一個元素的值,例如:
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;
如果您想獲得第一個RecipientStatus
或CustomField
以外的內容,則必須修改代碼。
避免使用Descendants
替換所有這些代碼的誘惑; 這樣做也會使您的代碼變慢且不准確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.