EnToutCas
EnToutCas

Reputation: 1357

XPath on an XML document with namespace

I'm having this XML document with namespaces and I want to extract some nodes using XPath.

Here's the document:

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

What's the XPath expression going to be if I want to extract all "anyType" elements with xsi:type="Document"?

I've tried this:

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

and it doesn't work:

Upvotes: 10

Views: 19814

Answers (4)

Bruno B
Bruno B

Reputation: 199

This way you don't need to specify namespace:

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

Upvotes: 0

CodeMonkey
CodeMonkey

Reputation: 1

Had nearly the same problem, I forgot to add the correct namespace for xsi:type (http://www.w3.org/2001/XMLSchema-instance) was using http://www.w3.org/2001/XMLSchema and I did never get any result - now it is working the following way:

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

Upvotes: -1

Jeremy French
Jeremy French

Reputation: 12187

I think that

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

Will do what you want.

Upvotes: 0

David
David

Reputation: 34573

If you are using C# then you need to specify the namespace for the "anyType" element in your 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 );

Upvotes: 18

Related Questions