【问题标题】:Query XML Document with Namespaces使用命名空间查询 XML 文档
【发布时间】:2011-09-25 09:49:57
【问题描述】:

我有一个 XML 文件的 sn-p,如下所示:

<?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") 给我想要的东西。但是,由于我在 &lt;ArrayOfCatalogItem&gt; 中有命名空间,我必须考虑到这一点。所以这是我到目前为止的代码:

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);
}

但是,我遇到的问题是 &lt;Name&gt; 标记中的命名空间定义。考虑到每个 &lt;Name&gt; 都有一个定义为属性的命名空间,我将如何查询文档中的所有 Name 值?

【问题讨论】:

    标签: xml


    【解决方案1】:

    您使用了错误的 XML 命名空间 - 您需要使用应用于 &lt;Name&gt; 标记的那个 - 而不是文档默认命名空间(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);
    }
    

    【讨论】:

    • 那行得通。但是,在您的代码中使用 AddNamespace 时,第一个参数是“rs”。但这在文档中的任何地方都没有定义。它确实有效,但现在我不明白 为什么 它有效。
    • @Coson:这只是一个任意您在代码中定义的 XML 命名空间前缀——它没有任何关系 与文档一起 - 在 your code 中为 XML 命名空间定义前缀只是 your way。当然,唯一必须 匹配的是实际的 XML 命名空间!但前缀完全独立于底层 XML 文档...
    • 那行得通。起初,我对 AddNamespace 方法的第一个参数感到困惑,因为我没有在文档中的任何地方看到“rs”定义。所以我猜你可以使用任何你想要的东西,因为没有指定命名空间。通过在两个位置将“rs”更改为“test”,它似乎可以工作。
    • 抱歉重复发帖,我的浏览器没有正确刷新。现在我很好。
    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 2023-03-08
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多