Почему я не могу получить значения атрибутов из моего XPathNavigator? - PullRequest
1 голос
/ 12 февраля 2010

У меня есть XML примерно так:

<?xml version="1.0"?>
<a xmlns="http://mynamespace">
  <b>
    <c val="test" />
  <b>
</a>

И я пытаюсь найти значение атрибута 'val' в теге 'c' примерно так:

XmlDocument doc = new XmlDocument();
doc.Load("myxml.xml");

nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace(@"mns", "http://mynamespace");

XPathNavigator root = doc.CreateNavigator();

foreach (XPathNavigator nav in root.Select("//mns:c", nsMgr))
{
    string val = nav.GetAttribute("val", NS);

    Console.WriteLine("val == "+val);
}

Моя проблема в том, что GetAttribute всегда возвращается в виде пустой строки. Чего мне не хватает?


Обновление:

Кажется, я могу это исправить, передав пустую строку в GetAttribute, т.е.

string val = nav.GetAttribute("val", "");

Поэтому мой вопрос сейчас: почему это работает? Почему «val» не принадлежит моему пространству имен, несмотря на то, что XML был проверен по схеме, для которой требуется атрибут «val» (я случайно пропустил этот шаг в моем примере кода выше, но я проверяю XML).

Ответы [ 2 ]

3 голосов
/ 12 февраля 2010

Декларации пространства имен по умолчанию не применяются к атрибутам, поэтому атрибут с именем 'val' отсутствует в пространстве имен, и если вы хотите получить к нему доступ, вам нужно получить к нему доступ без использования пространства имен. Единственный способ поместить атрибут в пространство имен - дать ему полное имя с префиксом и локальным именем (например, pf: val), где префикс связан с пространством имен (например, xmlns: pf = "http://example.com/foo").

2 голосов
/ 12 февраля 2010

Хорошо, я немного поохотился и обнаружил, что это контролируется в XSD следующим атрибутом элемента схемы:

attributeFormDefault="qualified"

или

attributeFormDefault="unqualified"

По умолчанию он выглядит «неквалифицированным», то есть атрибуты никогда не принадлежат никаким пространствам имен, а только элементам (естественно, управляется значением elementFormDefault).

Принудительное использование квалифицированных атрибутов по умолчанию заставляет любой XML требовать префиксов для всех атрибутов, принадлежащих этой схеме.

Кажется, ответ на мой вопрос состоит в том, что пустая строка является правильным пространством имен для всех атрибутов, определенных в любой схеме, которая принимает значение по умолчанию для этой опции.

Часть этого объясняется в разделе 6.3 здесь , в котором также говорится, что пространство имен по умолчанию не может применяться к атрибутам - в отличие от элементов, они должны иметь префиксы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...