【问题标题】:XDocument descendants is throwing a null referenceXDocument 后代抛出空引用
【发布时间】:2017-03-25 16:30:29
【问题描述】:

我有一个这样的 XML 文档:

<?xml version="1.0" encoding="utf-8"?>
<Settings updated="3/21/2017 15:48">
  <Setting name="ToolTipVariables">&lt;?xml version="1.0" encoding="utf-16"?&gt;
&lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
  &lt;string&gt;Title&lt;/string&gt;
  &lt;string&gt;Date&lt;/string&gt;
  &lt;string&gt;Description&lt;/string&gt;
  &lt;string&gt;Location&lt;/string&gt;
  &lt;string&gt;Id&lt;/string&gt;
&lt;/ArrayOfString&gt;</Setting>
  <Setting name="ToolTipVariables">&lt;?xml version="1.0" encoding="utf-16"?&gt;
&lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
  &lt;string&gt;Title&lt;/string&gt;
  &lt;string&gt;Date&lt;/string&gt;
  &lt;string&gt;Description&lt;/string&gt;
  &lt;string&gt;Location&lt;/string&gt;
  &lt;string&gt;Id&lt;/string&gt;
&lt;/ArrayOfString&gt;</Setting>
  <Setting name="ToolTipVariables">&lt;?xml version="1.0" encoding="utf-16"?&gt;
&lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
  &lt;string&gt;Title&lt;/string&gt;
  &lt;string&gt;Date&lt;/string&gt;
  &lt;string&gt;Description&lt;/string&gt;
  &lt;string&gt;Location&lt;/string&gt;
  &lt;string&gt;Id&lt;/string&gt;
&lt;/ArrayOfString&gt;</Setting>
  <Setting name="ShowUpdateWindow">&lt;?xml version="1.0" encoding="utf-16"?&gt;
&lt;boolean&gt;true&lt;/boolean&gt;</Setting>
</Settings>

我正在尝试像这样抓取第一个“ToolTipVariables”元素:

XDocument document = XDocument.Load(settingsPath); //settingsPath is where the XML Document is located
XElement element = document.Descendants("Settings").Where(x => x.Attribute("name").Value == "ToolTipVariables").FirstOrDefault();

但它在尝试获取 FirstOrDefault 时不断抛出空引用异常。也许我在某个地方犯了一个简单的错误,但我找不到它。任何帮助将不胜感激!

【问题讨论】:

  • 显然x.Attribute("name")在某些情况下必须为空,所以你想要Where(x =&gt; (string)x.Attribute("name") == "ToolTipVariables")

标签: c# xml linq xelement


【解决方案1】:

问题是您选择了所有名为Settings 的元素(这实际上是根节点。)代码document.Descendants("Settings") 将为您提供元素名称为Settings 的文档的所有后代。我认为您真正想要的是所有Setting 元素。这将起作用:

XElement element = document.Descendants("Setting")
    .Where(x => x.Attribute("name").Value == "ToolTipVariables")
    .FirstOrDefault();

【讨论】:

  • 啊-这是愚蠢的错误;)。我将“后代”误解为“这个的后代”而不是“命名这个的后代”。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2012-03-10
  • 2021-04-29
  • 2022-01-05
  • 2015-05-28
  • 1970-01-01
相关资源
最近更新 更多