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"]

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

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 );

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

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

Я думаю что

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

Будет делать то, что вы хотите.

Возникла почти та же проблема, я забыл добавить правильное пространство имен для 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>
Другие вопросы по тегам