Запрос значения, где существует узел пространства имен по умолчанию - PullRequest
1 голос
/ 14 мая 2010

У меня есть следующий XML-код, и я не могу его изменить:

<Parent>
  <Settings Version="1234" xmlns="urn:schemas-stuff-com"/>
</Parent>

Я пытаюсь получить значение атрибута «Версия» с помощью XPath. Похоже, поскольку xmlns определен без псевдонима, он автоматически назначает эти xmlns узлу «Настройки». Когда я читаю этот XML в XMLDocument и просматриваю значение namespaceURI для узла Settings, для него устанавливается «urn: schemas-stuff-com».

Я пробовал:

// Parent / Settings / @ Version - возвращает Null

// Parent / urn: schemas-stuff-com: Settings / @ Version - неверный синтаксис

Ответы [ 3 ]

0 голосов
/ 15 мая 2010

Использование XmlNamespaceManager:

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

XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
mgr.AddNamespace("foo", "urn:schemas-stuff-com");

XmlElement settings = doc.SelectSingleNode("Parent/foo:Settings", mgr) as XmlElement;
if (settings != null)
{
  // access settings.GetAttribute("version") here
}

// or alternatively select the attribute itself with XPath e.g.
XmlAttribute version = doc.SelectSingleNode("Parent/foo:Settings/@Version", mgr) as XmlAttribute;
if (version != null)
{
  // access version.Value here
}
0 голосов
/ 15 мая 2010

В дополнение к правильному ответу Мартина Хоннена, который, к сожалению, зависит от реализации и языка программирования, представляет собой чистое решение XPath :

/*/*[name()='Settings ']/@Version
0 голосов
/ 15 мая 2010

Решение зависит от того, какую версию XPath вы используете. В XPath 2.0 должно работать следующее:

declare namespace foo = "urn:schemas-stuff-com";
xs:string($your_xml//Parent/foo:Settings/@Version)

В XPath 1.0, с другой стороны, единственное решение, которое мне удалось получить, было:

//Parent/*[name() = Settings and namespace-uri() = "urn:schemas-stuff-com"]/@Version

Мне кажется, что процессор XPath не меняет пространство имен по умолчанию при изменении между узлами, хотя я не уверен, так ли это на самом деле.

Надеюсь, это поможет.

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