使用命名空间查询XML文档

时间:2011-06-08 18:57:13

标签: xml

我有一个XML文件的片段,如下所示:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfCatalogItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <CatalogItem>
        <ID xmlns="http://schemas.microsoft.com/sqlserver/2005/06/30/reporting/reportingservices">bbe9b897-5d3b-4340-914b-fce8d6022bd9</ID>
        <Name xmlns="http://schemas.microsoft.com/sqlserver/2005/06/30/reporting/reportingservices">EmployeeReport</Name>
    </CatalogItem>

现在我正在尝试查询文件中的所有Name元素。我知道我可以使用SelectNodes("//Name")给我我想要的东西。但是,由于我在<ArrayOfCatalogItem>中有名称空间,我必须考虑到这一点。所以这是我到目前为止的代码:

System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(@"C:\CatalogItems.xml");

// Create an XmlNamespaceManager for resolving namespaces
System.Xml.XmlNamespaceManager nsmgr = new System.Xml.XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
nsmgr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema");

System.Xml.XmlNodeList nodeList;
System.Xml.XmlNode root = doc.DocumentElement;

nodeList = root.SelectNodes("//Name", nsmgr);
Console.WriteLine("There are {0} items.", nodeList.Count);
foreach (System.Xml.XmlNode item in nodeList)
{
    Console.WriteLine(item.InnerText);
}

但是,我遇到的问题是<Name>标记中的命名空间定义。我如何在文档中查询所有Name值,并考虑每个<Name>是否将一个名称空间定义为一个属性?

1 个答案:

答案 0 :(得分:1)

您使用了错误的XML命名空间 - 您需要使用应用于<Name>标记的那个 - 而不是文档默认命名空间(xsd:xsi:前缀)。

试试这个:

using System.Xml;

XmlDocument doc = new XmlDocument();
doc.Load(@"C:\CatalogItems.xml");

// Create an XmlNamespaceManager for resolving namespaces
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("rs", "http://schemas.microsoft.com/sqlserver/2005/06/30/reporting/reportingservices");

XmlNodeList nodeList;
XmlNode root = doc.DocumentElement;

nodeList = root.SelectNodes("//rs:Name", nsmgr);

Console.WriteLine("There are {0} items.", nodeList.Count);

foreach (XmlNode item in nodeList)
{
    Console.WriteLine(item.InnerText);
}