Hello --
I'm attempting to get a handle on how to do xpath queries with
System.Xml -- so far the biggest hurdle has been how to deal with a
default namespace. If I use the test xml:
<?xml version="1.0" encoding="utf-8" ?>
<thing xmlns="urn:thin g-schema-v1">
<foo>foo thing</foo>
<bar>bar thing</bar>
<baz>baz thing</baz>
</thing>
....everything in the code below fails (as in no nodes are located, when
3 should be). However, if I remove the xmlns declaration from the
<thingroot element everything works fine. What am I doing wrong?
using System;
using System.Collecti ons.Generic;
using System.Text;
namespace XmlTest
{
class Program
{
static void Main(string[] args)
{
const string szXPath = "/thing/*";
const string szFilename = @"..\..\test-wo-xmlns.xml";
System.Xml.XmlR eader xmlReader = new
System.Xml.XmlT extReader(Syste m.IO.File.OpenR ead(szFilename) );
System.Xml.XmlN amespaceManager xmlNsMgr = new
System.Xml.XmlN amespaceManager (xmlReader.Name Table);
xmlNsMgr.AddNam espace(String.E mpty, "urn:thing-schema-v1");
System.Xml.XPat h.XPathDocument xpath = new
System.Xml.XPat h.XPathDocument (xmlReader);
System.Xml.XPat h.XPathNavigato r xpathNavi =
xpath.CreateNav igator();
System.Xml.XPat h.XPathNodeIter ator xpathQuery =
xpathNavi.Selec t(szXPath);
while(xpathQuer y.MoveNext())
{
string szValue = xpathQuery.Curr ent.Value;
System.Console. WriteLine(szVal ue);
}
System.Xml.XPat h.XPathExpressi on xpathExpr =
xpathNavi.Compi le(szXPath);
xpathExpr.SetCo ntext(xmlNsMgr) ;
xpathQuery = xpathNavi.Selec t(xpathExpr);
while (xpathQuery.Mov eNext())
{
string szValue = xpathQuery.Curr ent.Value;
System.Console. WriteLine(szVal ue);
}
System.Xml.XmlD ocument xmlDoc = new
System.Xml.XmlD ocument();
xmlDoc.Load(szF ilename);
System.Xml.XmlN amespaceManager xmlNsMgr2 = new
System.Xml.XmlN amespaceManager (xmlDoc.NameTab le);
xmlNsMgr2.AddNa mespace(String. Empty,
"urn:thing-schema-v1");
System.Xml.XmlN odeList xmlNodes =
xmlDoc.SelectNo des(szXPath);
foreach(System. Xml.XmlNode xmlNode in xmlNodes)
{
string szValue = xmlNode.Value;
System.Console. WriteLine(szVal ue);
}
}
}
}
I'm attempting to get a handle on how to do xpath queries with
System.Xml -- so far the biggest hurdle has been how to deal with a
default namespace. If I use the test xml:
<?xml version="1.0" encoding="utf-8" ?>
<thing xmlns="urn:thin g-schema-v1">
<foo>foo thing</foo>
<bar>bar thing</bar>
<baz>baz thing</baz>
</thing>
....everything in the code below fails (as in no nodes are located, when
3 should be). However, if I remove the xmlns declaration from the
<thingroot element everything works fine. What am I doing wrong?
using System;
using System.Collecti ons.Generic;
using System.Text;
namespace XmlTest
{
class Program
{
static void Main(string[] args)
{
const string szXPath = "/thing/*";
const string szFilename = @"..\..\test-wo-xmlns.xml";
System.Xml.XmlR eader xmlReader = new
System.Xml.XmlT extReader(Syste m.IO.File.OpenR ead(szFilename) );
System.Xml.XmlN amespaceManager xmlNsMgr = new
System.Xml.XmlN amespaceManager (xmlReader.Name Table);
xmlNsMgr.AddNam espace(String.E mpty, "urn:thing-schema-v1");
System.Xml.XPat h.XPathDocument xpath = new
System.Xml.XPat h.XPathDocument (xmlReader);
System.Xml.XPat h.XPathNavigato r xpathNavi =
xpath.CreateNav igator();
System.Xml.XPat h.XPathNodeIter ator xpathQuery =
xpathNavi.Selec t(szXPath);
while(xpathQuer y.MoveNext())
{
string szValue = xpathQuery.Curr ent.Value;
System.Console. WriteLine(szVal ue);
}
System.Xml.XPat h.XPathExpressi on xpathExpr =
xpathNavi.Compi le(szXPath);
xpathExpr.SetCo ntext(xmlNsMgr) ;
xpathQuery = xpathNavi.Selec t(xpathExpr);
while (xpathQuery.Mov eNext())
{
string szValue = xpathQuery.Curr ent.Value;
System.Console. WriteLine(szVal ue);
}
System.Xml.XmlD ocument xmlDoc = new
System.Xml.XmlD ocument();
xmlDoc.Load(szF ilename);
System.Xml.XmlN amespaceManager xmlNsMgr2 = new
System.Xml.XmlN amespaceManager (xmlDoc.NameTab le);
xmlNsMgr2.AddNa mespace(String. Empty,
"urn:thing-schema-v1");
System.Xml.XmlN odeList xmlNodes =
xmlDoc.SelectNo des(szXPath);
foreach(System. Xml.XmlNode xmlNode in xmlNodes)
{
string szValue = xmlNode.Value;
System.Console. WriteLine(szVal ue);
}
}
}
}
Comment