XPath для XML-документа с пространством имен - PullRequest
10 голосов
/ 18 февраля 2009

У меня есть этот документ 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 ]

18 голосов
/ 18 февраля 2009

Если вы используете 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 );
0 голосов
/ 14 февраля 2018

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

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("your xml");
XmlNode node = xmlDoc.SelectSingleNode("/*[local-name() = 'anyType']");
XmlNode nodeToImport = xmlDoc2.ImportNode(node, true);
xmlDoc2.AppendChild(nodeToImport);
0 голосов
/ 26 января 2011

У меня была почти такая же проблема, я забыл добавить правильное пространство имен для 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>
0 голосов
/ 18 февраля 2009

Я думаю, что

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

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

...