Wix格式XML使用SelectNodes查询返回0元素 命名空间配置问题求助
你出现查询无结果的问题,核心是两个问题:一是XPath中未给所有属于默认命名空间的节点加上你注册的命名空间前缀,二是部分API使用不符合规则。
三次尝试的错误点
- 第一次
SelectNodes写法错误:路径最后一级的Component没有加wx:前缀。你的XML根节点声明了默认命名空间http://schemas.microsoft.com/wix/2006/wi,文档内所有没有显式指定其他命名空间的元素都属于该命名空间,因此XPath路径中的每一级节点都需要绑定你注册的wx前缀。 - 第二次
GetElementsByTagName写法错误:该API仅支持传入单个元素的标签名,不支持多级路径查询,因此传入路径字符串无法匹配到任何节点。 - 第三次通过
local-name()查询的写法逻辑上是可以生效的,大概率是你代码中的引号转义错误,或者代码处于注释状态未实际执行导致无结果。
正确写法1(推荐,使用命名空间前缀,性能更高)
XmlNamespaceManager xnManager = new XmlNamespaceManager(doc.NameTable); xnManager.AddNamespace("wx", "http://schemas.microsoft.com/wix/2006/wi"); // 所有节点均添加wx前缀 XmlNodeList aNodes = doc.SelectNodes("//wx:Wix/wx:Fragment/wx:ComponentGroup/wx:Component", xnManager);
如果需要更精准匹配Id为ProgramFiles的ComponentGroup下的Component,可以调整XPath为:
XmlNodeList aNodes = doc.SelectNodes("//wx:ComponentGroup[@Id='ProgramFiles']/wx:Component", xnManager);
正确写法2(使用local-name,不需要命名空间管理器,适合临时快速查询)
XmlNodeList aNodes = doc.SelectNodes("//*[local-name()='Component']");
内容的提问来源于stack exchange,提问作者user2566049
相关产品推荐
相关产品推荐

