node.js - 具有命名空间的 xpath 查询根元素

标签 node.js xml xpath

我正在尝试使用命名空间寻址根元素并提供对库 xml-crypto 的引用.

我给的路径不对,请指教。目标是签署文档,以便可以将签名插入标签 <samlp:Response 之后

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="efedb3b0-909f-4b39-b8c0-57427ee8dc83" Version="2.0" IssueInstant="2019-11-08T15:34:51.272Z">

    <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">http://www.example.com</saml:Issuer>

</samlp:Response>

nodeJS 代码

var SignedXml = require('xml-crypto').SignedXml, fs = require('fs');
var sig = new SignedXml();

sig.addReference("//*[local-name(.)='samlp:Response']");

sig.signingKey = fs.readFileSync(__dirname + "/client.pem");
sig.computeSignature(xml);
fs.writeFileSync(__dirname + "/signed.xml", sig.getSignedXml());

尝试

sig.addReference("//samlp:Response");

Error: Cannot resolve QName samlp

它在 https://www.freeformatter.com/xpath-tester.html 运行良好虽然

最佳答案

如果你想打败/绕过命名空间,那么改变

sig.addReference("//*[local-name(.)='samlp:Response']");

sig.addReference("//*[local-name()='Response']");

因为命名空间前缀 samlp 不是本地名称 Response 的一部分。

有关 XPath 中 namespace 的全面解答,请参阅 How does XPath deal with XML namespaces?

关于node.js - 具有命名空间的 xpath 查询根元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58770257/

相关文章:

ios - 使用服务器上的 Socket.IO-Client-Swift 和 Swift、Sails.js 订阅房间(套接字)时出现问题

node.js - 用 Mongoose 增加值(value)?

java - Java 中的异步解析

xml - 使用XSLT 1.0获得唯一值(不使用XSL:Key)

Java如何提取一个完整的XML block

node.js - 如何在 Redis NodeJS 上订阅多个 channel

javascript - 考虑到我的使用方式,Node.js 是否适合我的项目?

xml - 如何定义具有模式的 XML 架构 ID 属性?

java - 无法在 div 类中找到元素

java - Xalan 和 document() 函数