XPath в XML-документе с пространством имен

У меня есть этот XML-документ с пространствами имен, и я хочу извлечь некоторые узлы с помощью XPath.

Вот документ:

<ArrayOfAnyType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
  <anyType xsi:type="Document">
    <Id>5</Id>
    <Title>T1</Title>
  </anyType>

  <anyType xsi:type="Document">
    <Id>15</Id>
    <Title>T15</Title>
  </anyType>
</ArrayOfAnyType>

Что будет с выражением XPath, если я хочу извлечь все элементы anyType с помощью xsi: type = "Document"?

Я пробовал это:

//anyType[@xsi:type="Document"]

и это не работает:


person EnToutCas    schedule 18.02.2009    source источник
comment
какую версию xpath вы используете? Версии xpath по-разному обрабатывают пространства имен?   -  person Jeremy French    schedule 18.02.2009
comment
Похоже, я должен сказать: '// xmlns: anyType [@xsi: type = Document]', чтобы он работал   -  person EnToutCas    schedule 18.02.2009


Ответы (4)


Если вы используете C #, вам необходимо указать пространство имен для элемента «anyType» в вашем XPath:

var xml = new XmlDocument();
xml.LoadXml( "your xml" );
var names = new XmlNamespaceManager( xml.NameTable );
names.AddNamespace( "xsi", "http://www.w3.org/2001/XMLSchema-instance" );
names.AddNamespace( "a", "http://tempuri.org/" );
var nodes = xml.SelectNodes( "//a:anyType[@xsi:type='Document']", names );
person David    schedule 18.02.2009
comment
Что случилось с a:anyType? Это какая-то магическая ценность? - person jcollum; 30.07.2015
comment
Нет, это имя элемента XML, который разыскивается в приведенном выше вопросе. - person David; 31.07.2015
comment
ах, я вижу, прокрутил недостаточно далеко - person jcollum; 31.07.2015

я так думаю

//anyType[namespace-uri() = "http://www.w3.org/2001/XMLSchema-instance"][local-name() = "type"]

Буду делать то, что хочешь.

person Jeremy French    schedule 18.02.2009
comment
Спасибо, я думаю, что в моем исходном выражении не так, мне нужно добавить префикс anyType к пространству имен xmlns. - person EnToutCas; 18.02.2009

Таким образом, вам не нужно указывать пространство имен:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("your xml");
XmlNode node = xmlDoc.SelectSingleNode("/*[local-name() = 'anyType']");
XmlNode nodeToImport = xmlDoc2.ImportNode(node, true);
xmlDoc2.AppendChild(nodeToImport);
person Bruno B    schedule 14.02.2018

Была почти такая же проблема, я забыл добавить правильное пространство имен для xsi: type (http://www.w3.org/2001/XMLSchema-instance) использовал http://www.w3.org/2001/XMLSchema, и я так и не получил никакого результата - теперь он работает следующим образом:

<xsl:value-of select="/item1/item2/item3/@xsi:type"></xsl:value-of>
person CodeMonkey    schedule 26.01.2011