我见过这个问题,其中 Dimitre Novatchev 展示了一种ends-with
使用 XPath 1.0 表达式进行复制的方法。但是,我无法在SelectNodes
通话中实现它。
以前我在使用
XmlElement root = doc.DocumentElement;
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("x", root.NamespaceURI);
XmlNodeList nodeList = doc.SelectNodes("//x:*[contains(name(.), '-notification')]", nsmgr);
它返回了我想要的所有节点加上一个我没有的节点,最后有一个额外的“s”(has-more-notifications
)。
所以我尝试使用 Dimitre 表达式,它给了我:
XmlNodeList nodeList = doc.SelectNodes("//x:*[substring(name(.), string-length(name(.)) - string-length('-notification') +1)]", nsmgr);
这惨败给了我的根节点notification-data-response
。
这是我第一次涉足 XPath,它看起来就像正则表达式——你要么理解它,要么不理解。
如何实现表达式,使其仅返回以 结尾的节点-notification
?
更新
输入样本:
<?xml version="1.0" encoding="UTF-8"?>
<notification-data-response xmlns="http://checkout.google.com/schema/2" serial-number="16ceae10-a9f1-4ff0-a77b-c3407f2d684a">
<notifications>
<new-order-notification serial-number="653417067275702-00001-7">
</new-order-notification>
<order-state-change-notification serial-number="653417067275702-00005-1">
</order-state-change-notification>
<risk-information-notification serial-number="653417067275702-00005-5">
</risk-information-notification>
<authorization-amount-notification serial-number="653417067275702-00005-6">
</authorization-amount-notification>
</notifications>
<continue-token>CP6u9NeQJxC2y72h-MiUARgG</continue-token>
<has-more-notifications>false</has-more-notifications>
</notification-data-response>