能否同时定位XML中的多个命名空间?
解决方案:匹配XML中的Row和Column元素
针对你的问题,我分两种场景详细说明:
一、能否用第三个命名空间(如A:)同时匹配两类元素?
答案是不行。XML的命名空间规则要求每个前缀只能绑定到一个唯一的命名空间URI,你无法将一个新前缀(比如A:)同时关联到Rows和Columns两个不同的命名空间。而且XPath只会识别文档中已声明的命名空间前缀,未在上下文或文档中绑定的前缀会导致匹配失败,所以这个思路无法实现需求。
二、能否通过local-name()函数跳过命名空间评估实现?
这个完全可行,而且是这类场景下的常用解决方案!local-name()函数会返回元素的本地名称(即去掉命名空间前缀后的部分),结合条件判断就能同时匹配Row和Column下的目标元素。
常用写法示例:
匹配所有Row和Column类型的元素(不限制本地名称)
如果你想抓取所有属于Rows或Columns命名空间的元素,可以通过命名空间URI来精准匹配://*[namespace-uri()='Rows' or namespace-uri()='Columns']这种方式比依赖前缀更可靠,因为前缀可能在不同文档中被修改,但命名空间URI是固定的。
匹配特定本地名称的元素(比如Product、Year)
如果你只想匹配本地名称为Product或Year的元素,不管它属于Row还是Column命名空间://*[local-name()='Product' or local-name()='Year']通过前缀判断(不推荐,前缀可能变化)
如果你确定前缀不会改变,也可以通过元素名称的前缀部分判断://*[starts-with(name(), 'R:') or starts-with(name(), 'C:')]
注意事项:
使用local-name()时要注意,如果文档中存在其他命名空间下的同名元素,可能会误匹配,所以结合namespace-uri()的方式更精准。
内容的提问来源于stack exchange,提问作者samuelbrody1249
相关产品推荐
相关产品推荐

