我可以解析 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)。
我已经接近尝试了 中的内容,但必须有一种更有效的方法来做到这一点,如果它的超级明显对 LINQ 和 C# 来说仍然很新,我深表歉意
<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
替换所有这些代码的诱惑;这样做也会使您的代码变得缓慢且不准确。