Cake PeekXml не «игнорирует» пространство имен - PullRequest
5 голосов
/ 12 июля 2019

Это ошибка или в дизайне, что атрибут xmlns не игнорируется?

(версия для торта 0.33.0)


С таким XML-кодом (слишком упрощенный файл nuspec):

<?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 Ответ

3 голосов
/ 17 июля 2019

Это не ошибка.

Чтобы игнорировать пространство имен, вы можете использовать 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()");

но будьте осторожны с документами с большим количеством элементов - это может стать очень медленным.

...