Cake PeekXml无法“忽略”命名空间。

6

请问xmlns属性不被忽略是一个错误还是设计上的考虑?

(cake版本0.33.0)


有一个类似于以下的Xml文件(一个过于简化的nuget规范文件):

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <metadata>
        <!-- Continuously updated elements -->
        <version>3.0.0</version>
    </metadata>
</package>

我进行了一个天真的调用:

var x = XmlPeek( "my.nuspec", "/package/metadata/version/text()" );

结果得到了 x==null

因此,我这样指定命名空间:

var settings = new XmlPeekSettings{
    Namespaces = new Dictionary<string, string> {{ 
        "ps", "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd" 
    }}
};
var x = XmlPeek( "my.nuspec", "/ps:package/ps:metadata/ps:version/text()", settings);

并获得预期的结果x == 3.0.0

1个回答

5

这不是一个bug。

如果要忽略命名空间,可以使用命名空间无关的xpath,例如local-name()

var x = XmlPeek( "my.nuspec", "/*[local-name() = 'package']/*[local-name() = 'metadata']/*[local-name() = 'version']/text()");

如果您只有一个version节点:
var x = XmlPeek( "my.nuspec", "//*[local-name()='version']/text()");

但是对于元素数量很大的文档要小心——这可能会变得非常慢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接