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>