XmlNameSpaceManager - 确定 XmlDocument 的正确命名空间管理器的优雅方式

XmlNameSpaceManager - Elegant way of determining correct namespace manager for XmlDocument

提问人:Craig 提问时间:5/22/2023 更新时间:5/22/2023 访问量:61

问:

我有大量的xml文件,它们对应于三个可能的命名空间表之一,我想通过XmlNode.SelectSingleNode提取数据,但是我想知道这是尝试通过C#代码(.NET)建立要使用的XmlNameSpaceManager的最优雅方法。

我正在尝试建立一种最优雅的方法来查找与 XmlDocument 实例关联的正确、相应的 NameSpaceManager。

XmlNode x = xmlDoc.SelectSingleNode(“/root/Person/Name”, namespaceManager);

namespaceManager 可以与以下任何一项相关联:-

private XmlNamespaceManager namespaceManager_v1()
{
    NameTable nt = new NameTable();
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
    nsmgr.AddNamespace("a", "a:v1");
    nsmgr.AddNamespace("b", "b:v1");
    nsmgr.AddNamespace("version", "1.0");
}

private XmlNamespaceManager namespaceManager_v2()
    {
    NameTable nt = new NameTable();
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
    nsmgr.AddNamespace("a", "a:v2");
    nsmgr.AddNamespace("b", "b:v2");
    nsmgr.AddNamespace("version", "2.0");
}

private XmlNamespaceManager namespaceManager_v3()
    {
    NameTable nt = new NameTable();
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
    nsmgr.AddNamespace("a", "a:v3");
    nsmgr.AddNamespace("b", "b:v3");
    nsmgr.AddNamespace("version", "3.0");
}

是否需要遍历直到返回结果?

if (xmlDoc.SelectSingleNode("/root/Person/Name", namespaceManager_v1) != null)
   {
     //Do something
   }
else
   {
     if (xmlDoc.SelectSingleNode("/root/Person/Name", namespaceManager_v2) != null)
       {
           //Do something
       }
     else
       {
         if (xmlDoc.SelectSingleNode("/root/Person/Name", namespaceManager_v3) != null)
           {
            //Do something
           }
       }
   }

任何建议都非常感谢。

谢谢

XML 命名空间 xml-namespaces xmldocument xmlnode

评论

0赞 dbc 7/25/2023
1)你的XPATH查询实际上并没有使用任何命名空间,所以在实践中这应该无关紧要。2) 您能否编辑您的问题以共享 XML 示例?根XML元素可能属于存储在其中的命名空间之一,所以你能看看吗?XmlNamespaceManager

答: 暂无答案