【问题标题】:How to fetch root level node in XML C#如何在 XML C# 中获取根级节点
【发布时间】:2018-08-02 10:08:52
【问题描述】:

我正在尝试访问给定 xml 中第一级的元素。我正在使用下面的代码来访问它,但它首先给了我一个嵌套的代码。

 var xml = "<grading>" +
                      "<leap>" +
                         "<controlId>1</controlId>" +
                       "</leap>" +
                     "<controlId>2</controlId>" +
                   "</grading>";

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);

        var node = doc.DocumentElement.SelectSingleNode("//controlId").InnerText;

当我试图访问根节点内的值 2 时,它给了我值 1。我们有什么可以访问它的吗?

【问题讨论】:

  • 该代码给了我一个 NullReferenceException 代替(由于使用/)...如果您提供演示实际问题的代码会有所帮助。不过,我会支持使用 LINQ to XML 的建议。
  • 您是否必须(想要)使用 XmlDocument 和 XPath?使用 XDocument 会容易得多。
  • 我已经更新了代码。现在它不会报错
  • 对,现在你已经使用了//,意思是“找到第一个后代”。如果您只使用SelectSingleNode("controlId"),它会起作用,尽管我绝对推荐使用 LINQ to XML。

标签: c# xml xmldocument


【解决方案1】:

您的 XPath 表达式是

//controlId

这将找到 所有 个名为 controlId 的后代。你只想要你调用方法的元素的直接子元素,所以你应该使用

controlId

所以这行得通:

var node = doc.DocumentElement.SelectSingleNode("controlId").InnerText;

但是,我强烈建议使用 LINQ to XML,作为更简洁的 XML API:

using System;
using System.Xml.Linq;

public class Program
{
    public static void Main(string[] args)
    {
        var xml = @"
<grading>
  <leap>
    <controlId>1</controlId>
  </leap>
  <controlId>2</controlId>
</grading>";

        XDocument doc = XDocument.Parse(xml);
        XElement control = doc.Root.Element("controlId");
        Console.WriteLine(control.Value); // 2
    }
}

除非您真的想使用它的高级功能,否则我会避免使用 XPath。要仅按名称检索元素、属性等,LINQ to XML API 更简单且不易出错(正如这个问题的存在所示)。

【讨论】:

    【解决方案2】:
     var node = doc.DocumentElement.SelectSingleNode("//grading/controlId").InnerText;
    

    【讨论】:

      【解决方案3】:

      我在解析 XML 时使用了很多 LINQ TO XML。例如获取集合中的根。

      string xml = "";
      XDocument doc = XDocument.Parse(xml);   
      XElement elRoot = doc.Root
      

      更多资源可以在这里找到: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/linq-to-xml-overview

      【讨论】:

      • 我认为您的意思是 LINQ to XML 而不是 LINQ to SQL。
      猜你喜欢
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      相关资源
      最近更新 更多