c# - XPath 不适用于 SelectSingleNode

标签 c# xml xpath selectsinglenode

private const string TECHACCOUNTAMTITEM_AMT_XPATH = @"//Part[translate(@Type, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'instalment']/acord:Jv-Ins-Reinsurance/acord:TechAccount/acord:Subaccount/acord:TechAccountAmtItem[translate(@Type, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') != 'ipt' and translate(@AmtStatus, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') != 'informational']/acord:Amt";

var xmlNamespaceManager = this._namespaceManager.GetNamespaceManager(this.TransactionPayload.OuterXml);
                var techAccountAmtItemAmt = Decimal.Parse(this.TransactionPayload.SelectSingleNode(TECHACCOUNTAMTITEM_AMT_XPATH, xmlNamespaceManager).InnerText);

以上两条语句给出的值是 4500。

但我不想使用翻译,只想直接使用它来获取值。

看来 != 在下面不起作用,并且没有获取值并导致 null 。

这是我试图实现但不起作用的新 Xpath。

private const string TECHACCOUNTAMTITEM_AMT_XPATH = @"//Part[@Type = 'Instalment']/acord:Jv-Ins-Reinsurance/acord:TechAccount/acord:Subaccount/acord:TechAccountAmtItem[@Type != 'ipt' and @AmtStatus != 'informational']/acord:Amt";

我怎样才能达到同样的效果?

最佳答案

这样做的原因是 != 要求该属性存在,而如果缺少该属性,translate 也会产生结果。

您需要使用not()来代替:

.../acord:‌​TechAccountAmtItem[not(@‌​Type = 'ipt') and not(@AmtStatus = 'informational')]/...

这假设 Type 也可能丢失。如果没有,您可以使用 @Type != 'ipt' 代替。

关于c# - XPath 不适用于 SelectSingleNode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47925166/

相关文章:

c# - 如何测试函数返回 IEnumerable<Integer>

xml - 从 XML 到 XSD

java - 在 eclipse 中创建应用程序 : Error parsing XML: not well-formed (invalid token)

html - 如何通过 xpath 或 css 选择器在 map 上定位元素

ruby - 在 Ruby 中使用 xPath 选择组中的段落

c# - 将两个包含属性的对象合并为一个对象

c# - 为什么我的扩展方法没有出现在我的测试类中?

c# - 转换日期表示不支持

java - 如何使用 jaxb 获取 XML 格式的标签之间的值

xml - XPath 或 XML 内容中的上下文概念是什么