Какое пространство имен необходимо для использования метода SelectSingleNode() (с использованием пространства имен по умолчанию и не может использовать метод)

Привет, у меня есть файл xml (который на самом деле является файлом msbuild), который использует другое пространство имен.

<?xml version="1.0" ?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup Condition="'$(key)'=='1111'">
          <Key>Value</Key>
    </PropertyGroup>
</Project>

Но проблема в том, что я не могу использовать SelectSingleNode с этим файлом из-за

xmlns="http://schemas.microsoft.com/developer/msbuild/2003"

Я полагаю, что это связано с тем, что пространство имен по умолчанию (необходимое для метода) исчезло из-за приведенного выше xmlns. Тогда я думаю, что мне просто нужно добавить необходимый для этого.. Но мои попытки не увенчались успехом. Не могли бы вы дать мне быстрый пример, как это сделать?

Вот как я это сделал. (Я также пытался добавить несколько пространств имен, но безуспешно..)

XmlDocument xml = new XmlDocument();
xml.Load("ref.props");        
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");

XmlNode platform_node
  = xml.SelectSingleNode("//msbld:PropertyGroup[contains(@Condition, '1111')]", nsmgr);

person in His Steps    schedule 05.02.2013    source источник
comment
В отличие от форумов, мы не используем слова «Спасибо» или «Любая помощь приветствуется» или подписи на Stack Overflow. См. раздел Должен ли быть "Привет", "спасибо" слоганов и приветствий удалить из постов?.   -  person John Saunders    schedule 05.02.2013
comment
Ах хорошо! я запомню   -  person in His Steps    schedule 05.02.2013


Ответы (1)


Вам нужно использовать правильное пространство имен, которым является "http://schemas.microsoft.com/developer/msbuild/2003".

Пытаться

XmlDocument xml = new XmlDocument();
xml.Load("ref.props");        
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("ms", "http://schemas.microsoft.com/developer/msbuild/2003");

XmlNode platform_node
  = xml.SelectSingleNode("/ms:Project/ms:PropertyGroup[contains(@Condition, '1111')]",
                         nsmgr);

Не путайте префикс пространства имен (который был пустым в XML) с пространством имен "http://schemas.microsoft.com/developer/msbuild/2003".

person John Saunders    schedule 05.02.2013
comment
Попробуйте удалить [contains] и посмотрите, получится ли что-нибудь. - person John Saunders; 05.02.2013
comment
Я получил сообщение об ошибке «Ссылка на объект не указывает на экземпляр объекта» при удалении содержимого.. - person in His Steps; 05.02.2013
comment
На какой строчке ты это понял? Бьюсь об заклад, это было после вашего SelectSingleNode. - person John Saunders; 05.02.2013
comment
о.. да, это было после SelectSingleNode! Извини за это - person in His Steps; 05.02.2013
comment
Могу я задать еще один вопрос? Мне нужно получить дочерний узел этой группы свойств. но имя дочернего узла является динамическим, поэтому я не могу просто добавить имя в запрос xpath. Но у меня есть строковая переменная, которая содержит имя дочернего узла. Тогда, в этом случае, как мне написать запрос xpath, чтобы я мог запрашивать только внутри родительского узла и использовать строковую переменную? - person in His Steps; 05.02.2013
comment
Один вопрос на вопрос, пожалуйста. Задайте отдельный вопрос. - person John Saunders; 05.02.2013
comment
Ах .. ладно .. извините за это - person in His Steps; 05.02.2013