【问题标题】:XML Object reference not set to an instance of an objectXML 对象引用未设置为对象的实例
【发布时间】:2020-11-17 17:00:20
【问题描述】:

我想阅读这个 XML,但它只给了我“对象引用未设置为对象的实例。

XDocument doc = XDocument.Parse(responseString);

string valueX = doc.Root.Element("reponse").Element("point").Element("x").Value;
string valueY = doc.Root.Element("reponse").Element("point").Element("y").Value;

Console.WriteLine("TEST");
Console.WriteLine("Timb East" + valueX);
Console.WriteLine("Timb North" + valueY);

这是我的 responseString XML 示例,我想取 X 和 Y 的值。

<reponse><point><x>12557735.513928</x><y>5500887.2196169</y><projection>EPSG::29873</projection></point></reponse>

谁能告诉我这里出了什么问题?谢谢。

编辑:将响应拼写修复为响应。

【问题讨论】:

  • 拼写:XML 包含 &lt;reponse&gt;(拼写错误)但您的 c# 代码使用 Element("response")(拼写正确)。
  • @dbc 感谢您指出拼写错误!但是在我修正了拼写之后,仍然是同样的错误输出。
  • 哦,对了,你正在做doc.Root.Element("response"),但Root已经是根元素,所以你只需要做doc.Element("response")doc.Root.Element("point")

标签: c# xml


【解决方案1】:

如果你像下面这样更改代码以使用XmlDocument 类型中存在的GetElementsByTagName() 方法会怎样

        string msg = "<response><point><x>12557735.513928</x><y>5500887.2196169</y><projection>EPSG::29873</projection></point></response>";             
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(msg);
        var valueX = doc.GetElementsByTagName("x")[0].InnerText;
        string valueY = doc.GetElementsByTagName("y")[0].InnerText;

        Console.WriteLine("TEST");
        Console.WriteLine("Timb East" + valueX);
        Console.WriteLine("Timb North" + valueY);

【讨论】:

  • 我不确定我是否会建议 OP 恢复到较旧的 XmlDocument API。另外,在the documentation for GetElementsByTagName() Microsoft 中写道,建议您使用 XmlNode.SelectNodes 或 XmlNode.SelectSingleNode 方法,而不是 GetElementsByTagName 方法。
【解决方案2】:

两个问题,都是关于如何访问根元素的:

  1. XML 中的根元素名称与代码预期的根元素名称不匹配(拼写不一致)。

    XML 包含根元素 &lt;reponse&gt;(拼写错误),但您的 c# 代码使用 "response"(拼写正确)。

    您需要修复代码和 XML 根元素名称以保持一致。

  2. 当你这样做时

    doc.Root.Element("response")...
    

    您正在尝试访问 XML 文档根元素的一个名为 &lt;response&gt; 的子元素。但是&lt;response&gt;(或&lt;reponse&gt;已经是根元素,并且没有这样的子元素。因此你需要这样做:

    var valueX = doc.Root.Element("point").Element("x").Value;
    

    或者

    var valueX = doc.Element("reponse").Element("point").Element("x").Value;
    

    (即doc.Rootdoc.Element("reponse")在做同样的事情,即返回根元素,所以不需要两者都做。)

小提琴样本here.

【讨论】:

    【解决方案3】:

    假设xml只包含&lt;x&gt;&lt;y&gt;两个节点,可以试试下面的代码

     System.Xml.Linq.XElement xml = System.Xml.Linq.XElement.Parse("<response><point><x>12557735.513928</x><y>5500887.2196169</y><projection>EPSG::29873</projection></point></response>");
    
                var valueX = xml.Descendants().SingleOrDefault(x => x.Name.LocalName == "x")?.Value;
                var valueY = xml.Descendants().SingleOrDefault(x => x.Name.LocalName == "y")?.Value;
                Console.WriteLine("TEST");
                Console.WriteLine("Timb East" + valueX);
                Console.WriteLine("Timb North" + valueY);
    

    【讨论】:

      【解决方案4】:

      有些事情不是你想象的那样。

      Element 的任何调用都可能返回null

      XContainer.Element(XName) Method

      与指定 XName 匹配的 XElement,或者为 null。

      如果您不确定,请使用null conditional operator

      string valueX = doc.Root.Element("response")?.Element("point")?.Element("x")?.Value;
      

      但是,它很可能没有按您的预期进行解析,或者数据不是您的预期。

      【讨论】:

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