【问题标题】:How to select xml root node when root node has attribute?根节点有属性时如何选择xml根节点?
【发布时间】:2011-05-02 10:50:49
【问题描述】:

我正在尝试使用 XPath 查询选择 xml 文档的根节点的所有子节点。

我的 xml 文件如下所示:

<?xml version="1.0" encoding="UTF-8" ?> 
<root>
    <automotive_industry>
        <automotive /> 
        <rail_global_services /> 
    </automotive_industry>
</root>

<?xml version="1.0" encoding="UTF-8" ?> 
<root xmlns="http://www.my_department.my_company.com/project_name">
    <automotive_industry>
        <automotive /> 
        <rail_global_services /> 
    </automotive_industry>
    </root>

选择根节点的C#代码如下:

XmlDocument gazetteDocument = new XmlDocument();
gazetteDocument.Load(xmlFilePath);
XmlNodeList allNodes = gazetteDocument.SelectNodes("root");

此代码工作正常,当根节点没有任何属性时,它会选择根节点的所有子节点,即它适用于第一个 xml 文件,但不适用于第二个 xml 文件,因为第二个文件具有 xmlns 属性。

有谁知道根节点有属性时如何选择根节点的所有子节点??

编辑: 我找到了一个 XPath 查询:/* 这个查询选择根节点,不管它是否有任何属性。一旦选择了根节点,我就可以遍历它的所有子节点。

【问题讨论】:

标签: c# xml xpath


【解决方案1】:

虽然 XML 文档中的命名空间很好,但您需要在 SelectNodes 中使用它。 将此代码用于您的第二个 XML:

XmlDocument gazetteDocument = new XmlDocument();
gazetteDocument.Load(xmlFilePath);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(gazetteDocument.NameTable);
nsmgr.AddNamespace("ns", "http://www.my_department.my_company.com/project_name");
XmlNodeList allNodes = gazetteDocument.SelectNodes("ns:root", nsmgr);

更好的方法是使用XDocument 和相应的类。它们更容易使用。

【讨论】:

  • 感谢您的帮助。我们仍处于 .net 2.0 框架时代,所以我认为我不能使用 XDocument。我会尝试使用您的其他解决方案。
【解决方案2】:

我不知道 C# 的旧 xml 方法,但您始终可以打开文件以读取普通文本,然后读取到第一个节点并根据需要对其进行解析。

【讨论】:

    【解决方案3】:

    您可以使用 GetElementsByTagName 方法,下面是我的代码的 sn-p

    XmlDocument gazetteDocument = new XmlDocument();
    gazetteDocument.Load(xmlFilePath);
    XmlNodeList allNodes = gazetteDocument.GetElementsByTagName("root");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多