【问题标题】:XPath not working with SelectSingleNodeXPath 不适用于 SelectSingleNode
【发布时间】:2017-12-21 12:36:57
【问题描述】:
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";

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

【问题讨论】:

    标签: c# xml xpath selectsinglenode


    【解决方案1】:

    原因是!=要求属性存在,而translate如果属性缺失也会产生结果。

    您需要改用not()

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

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

    【讨论】:

    • 我尝试了 [not() 和 not()] 以及 MSDN 中的许多关键字,但几个小时都没有工作。这次我试了一下,效果很好。谢谢 :) [not(@Type = 'insurance_premium_tax') 和 not(@AmtStatus = 'informational')]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多