如何在PHP中用XPath提取指定Properties标签并做SHA256哈希
在PHP中提取UBL XML的Signed Properties标签内容并计算SHA256哈希
核心实现思路
UBL格式XML通常包含多命名空间,提取目标标签需先注册对应命名空间,再通过XPath定位节点,最后对节点完整内容计算SHA256哈希。
代码示例
// 加载UBL XML文件 $xmlDoc = new DOMDocument(); // 可选:关闭空白节点保留,避免格式差异影响哈希结果 $xmlDoc->preserveWhiteSpace = false; $xmlDoc->load('path/to/your-invoice.xml'); // 初始化XPath并注册命名空间(根据XML实际配置调整) $xpath = new DOMXPath($xmlDoc); // 注册数字签名命名空间(通常为http://www.w3.org/2000/09/xmldsig#) $xpath->registerNamespace('ds', 'http://www.w3.org/2000/09/xmldsig#'); // 使用步骤4指定的XPath路径查询目标节点 $targetNodes = $xpath->query('//ds:SignedProperties'); if ($targetNodes->length > 0) { // 获取节点的完整XML内容(包含自身标签及所有子节点) $signedPropertiesContent = $xmlDoc->saveXML($targetNodes->item(0)); // 计算SHA256哈希 $sha256Result = hash('sha256', $signedPropertiesContent); // 输出结果(可根据业务需求调整处理逻辑) echo "提取的Signed Properties内容:\n" . $signedPropertiesContent . "\n"; echo "SHA256哈希值: " . $sha256Result; } else { echo "未找到指定的Signed Properties标签"; }
关键注意事项
- 必须确保注册的命名空间URI与XML文件中
ds前缀对应的xmlns:ds属性值完全一致,否则XPath查询会失败。 - 替换代码中的
//ds:SignedProperties为步骤4给出的精确XPath路径。 - 若需保证同内容不同格式的XML哈希结果一致,可在加载前设置
$xmlDoc->preserveWhiteSpace = false和$xmlDoc->formatOutput = false,消除空白字符差异。
内容的提问来源于stack exchange,提问作者Farveen Hassan
相关产品推荐
相关产品推荐

