469,292 Members | 1,349 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,292 developers. It's quick & easy.

XPath problem with two xmlns

I have got file raport.rld which is an XML file generated by MS Reporting
Services.

The problem is:

in this file are tags from two different namespaces

xmlns="http://schemas.microsoft.com/sqlserver/reporting/2003/10/reportdefini
tion"
xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"

when I'm trying to use XPATH to get <teble> tag it doesn't work. (the
result is empty)

I've removed All tegs like

<rd:TypeName>System.Int32</rd:TypeName>

Now all is working fine but what to do when I have tags from two different
namespaces?

I don't want to remove all tags from second namespace.

Tom.

Nov 12 '05 #1
4 8616


Gismo wrote:
I have got file raport.rld which is an XML file generated by MS Reporting
Services.

The problem is:

in this file are tags from two different namespaces

xmlns="http://schemas.microsoft.com/sqlserver/reporting/2003/10/reportdefini
tion"
xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"

when I'm trying to use XPATH to get <teble> tag it doesn't work. (the
result is empty)

I've removed All tegs like

<rd:TypeName>System.Int32</rd:TypeName>

Now all is working fine but what to do when I have tags from two different
namespaces?


You need to declare a prefix for every namespace and then use the prefix
in your XPath expression. How you do that depends on the environment, if
you use XPath inside of an XSLT stylesheet you can simply declare the
prefixes with
<xsl:stylesheet

xmlns:rd="xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"
and then use
rd:TypeName
in your XPath expression.

If you are using an API like selectNodes/selectSingleNode then you need
to call
xmlDocument.setProperty("SelectionNamespaces",

"xmlns:rd='http://schemas.microsoft.com/SQLServer/reporting/reportdesigner'")

--

Martin Honnen
http://JavaScript.FAQTs.com/

Nov 12 '05 #2

Uzytkownik "Martin Honnen" <ma*******@yahoo.de> napisal w wiadomosci
news:Oq*************@TK2MSFTNGP09.phx.gbl...


Gismo wrote:
I have got file raport.rld which is an XML file generated by MS Reporting Services.

The problem is:

in this file are tags from two different namespaces

xmlns="http://schemas.microsoft.com/sqlserver/reporting/2003/10/reportdefini tion"
xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"
when I'm trying to use XPATH to get <teble> tag it doesn't work. (the
result is empty)

I've removed All tegs like

<rd:TypeName>System.Int32</rd:TypeName>

Now all is working fine but what to do when I have tags from two different namespaces?
You need to declare a prefix for every namespace and then use the prefix
in your XPath expression. How you do that depends on the environment, if
you use XPath inside of an XSLT stylesheet you can simply declare the
prefixes with
<xsl:stylesheet

xmlns:rd="xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportd
esigner" and then use
rd:TypeName
in your XPath expression.

If you are using an API like selectNodes/selectSingleNode then you need
to call
xmlDocument.setProperty("SelectionNamespaces",

"xmlns:rd='http://schemas.microsoft.com/SQLServer/reporting/reportdesigner'"
)
--

Martin Honnen
http://JavaScript.FAQTs.com/

There is no method like setProperty.
My example code is:

My example code is:
using System;
using System.IO;
using System.Xml;
public class Sample
{
public static void Main()
{
XmlDocument doc = new XmlDocument();
doc.Load("c:/tab2.xml");

XmlElement root = doc.DocumentElement;

XmlNodeList nodeList;
nodeList = root.SelectNodes("//Table");
if (nodeList != null)
foreach (XmlNode s1 in nodeList)
{
try
{
Console.WriteLine(s1.Name);
}
catch (XmlException e) {
Console.WriteLine(e.Message);
}
}
}
}


Gismo.

Nov 12 '05 #3


Gismo wrote:
Uzytkownik "Martin Honnen" <ma*******@yahoo.de> napisal w wiadomosci
news:Oq*************@TK2MSFTNGP09.phx.gbl...

Gismo wrote:

I have got file raport.rld which is an XML file generated by MS
Reporting
Services.

The problem is:

in this file are tags from two different namespaces
xmlns="http://schemas.microsoft.com/sqlserver/reporting/2003/10/reportdefini
tion"

xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"
when I'm trying to use XPATH to get <teble> tag it doesn't work. (the
result is empty)

I've removed All tegs like

<rd:TypeName>System.Int32</rd:TypeName>

Now all is working fine but what to do when I have tags from two
different
namespaces?
You need to declare a prefix for every namespace and then use the prefix
in your XPath expression. How you do that depends on the environment, if
you use XPath inside of an XSLT stylesheet you can simply declare the
prefixes with
<xsl:stylesheet


xmlns:rd="xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportd
esigner"
and then use
rd:TypeName
in your XPath expression.

If you are using an API like selectNodes/selectSingleNode then you need
to call
xmlDocument.setProperty("SelectionNamespaces",


"xmlns:rd='http://schemas.microsoft.com/SQLServer/reporting/reportdesigner'"
)

There is no method like setProperty.


Sorry, I thought you might be using MSXML but you use .NET, there indeed
is no such method.

With .NET you need an XmlNamespaceManager and declare the prefixes for
your XPath expressions and then pass that manager to the SelectNodes method.
For instance with the example document being

<?xml version="1.0" encoding="UTF-8"?>
<gods xmlns="http://vatican.va/2004/gods">
<god name="Kibo" />
<god name="Jaffo" />
<dv:devil xmlns:dv="http://vatican.va/2004/devils" name="Xibo" />
</gods>

the following successfully queries the document using XPath

using System;
using System.Xml;

public class Test20040402 {
public static void Main (string[] args) {
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(@"test20040402.xml");
XmlNamespaceManager namespaceManager = new
XmlNamespaceManager(xmlDocument.NameTable);
namespaceManager.AddNamespace("gs", "http://vatican.va/2004/gods");
namespaceManager.AddNamespace("dv", "http://vatican.va/2004/devils");
XmlNodeList gods = xmlDocument.SelectNodes("/gs:gods/gs:god",
namespaceManager);
Console.WriteLine("Found {0} elements.", gods.Count);
foreach (XmlNode node in gods) {
Console.WriteLine(node.Name);
}
gods = xmlDocument.SelectNodes("/gs:gods/dv:devil", namespaceManager);
Console.WriteLine("Found {0} elements.", gods.Count);
foreach (XmlNode node in gods) {
Console.WriteLine(node.Name);
}
}

}
--

Martin Honnen
http://JavaScript.FAQTs.com/

Nov 12 '05 #4

Thanx, it works fine now.
:-)

Gismo.

Uzytkownik "Martin Honnen" <ma*******@yahoo.de> napisal w wiadomosci
news:#T**************@TK2MSFTNGP10.phx.gbl...


Gismo wrote:
Uzytkownik "Martin Honnen" <ma*******@yahoo.de> napisal w wiadomosci
news:Oq*************@TK2MSFTNGP09.phx.gbl...

Gismo wrote:
I have got file raport.rld which is an XML file generated by MS
Reporting
Services.

The problem is:

in this file are tags from two different namespaces


xmlns="http://schemas.microsoft.com/sqlserver/reporting/2003/10/reportdefini
tion"


xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"


when I'm trying to use XPATH to get <teble> tag it doesn't work. (the
result is empty)

I've removed All tegs like

<rd:TypeName>System.Int32</rd:TypeName>

Now all is working fine but what to do when I have tags from two


different
namespaces?

You need to declare a prefix for every namespace and then use the prefix
in your XPath expression. How you do that depends on the environment, if
you use XPath inside of an XSLT stylesheet you can simply declare the
prefixes with
<xsl:stylesheet


xmlns:rd="xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportd esigner"
and then use
rd:TypeName
in your XPath expression.

If you are using an API like selectNodes/selectSingleNode then you need
to call
xmlDocument.setProperty("SelectionNamespaces",


"xmlns:rd='http://schemas.microsoft.com/SQLServer/reporting/reportdesigner'" )

There is no method like setProperty.


Sorry, I thought you might be using MSXML but you use .NET, there indeed
is no such method.

With .NET you need an XmlNamespaceManager and declare the prefixes for
your XPath expressions and then pass that manager to the SelectNodes

method. For instance with the example document being

<?xml version="1.0" encoding="UTF-8"?>
<gods xmlns="http://vatican.va/2004/gods">
<god name="Kibo" />
<god name="Jaffo" />
<dv:devil xmlns:dv="http://vatican.va/2004/devils" name="Xibo" />
</gods>

the following successfully queries the document using XPath

using System;
using System.Xml;

public class Test20040402 {
public static void Main (string[] args) {
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(@"test20040402.xml");
XmlNamespaceManager namespaceManager = new
XmlNamespaceManager(xmlDocument.NameTable);
namespaceManager.AddNamespace("gs", "http://vatican.va/2004/gods");
namespaceManager.AddNamespace("dv", "http://vatican.va/2004/devils");
XmlNodeList gods = xmlDocument.SelectNodes("/gs:gods/gs:god",
namespaceManager);
Console.WriteLine("Found {0} elements.", gods.Count);
foreach (XmlNode node in gods) {
Console.WriteLine(node.Name);
}
gods = xmlDocument.SelectNodes("/gs:gods/dv:devil", namespaceManager); Console.WriteLine("Found {0} elements.", gods.Count);
foreach (XmlNode node in gods) {
Console.WriteLine(node.Name);
}
}

}
--

Martin Honnen
http://JavaScript.FAQTs.com/

Nov 12 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Hollywood | last post: by
2 posts views Thread by ree32 | last post: by
3 posts views Thread by Jason Mobarak | last post: by
2 posts views Thread by Monty | last post: by
6 posts views Thread by J.Marsch | last post: by
2 posts views Thread by A. W. Dunstan | last post: by
1 post views Thread by reyesvsn | last post: by
reply views Thread by zhoujie | last post: by
reply views Thread by harlem98 | last post: by
1 post views Thread by Geralt96 | last post: by
reply views Thread by harlem98 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.