我有一个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>
是否将一个名称空间定义为一个属性?
答案 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);
}