【问题标题】:XML parsing exception in C#C#中的XML解析异常
【发布时间】:2015-08-09 18:31:51
【问题描述】:

我在解析 XML 文档中的一个特定值时遇到了一点问题。我使用的代码如下:

WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
XDocument doc = XDocument.Load(responseStream);
XElement root = doc.Root;
ClassVars.LastTimeStamp = (int)root.Elements("TIMESTAMP").Last();

但是,此代码正在生成以下异常:

“System.InvalidOperationException”类型的未处理异常 发生在 System.Core.dll

(完整的错误信息是here。)

坦率地说,我这辈子都想不通为什么。它出错的行是ClassVars.LastTimeStamp = (int)root.Elements("TIMESTAMP").Last(); 行。我正在尝试从以下 XML 解析它:

<REGION>
<MESSAGES>
<POST>
<TIMESTAMP>1439137652</TIMESTAMP>
<NATION>...</NATION>
<MESSAGE>
</MESSAGE>
</POST>
...
...
...
<POST>
<TIMESTAMP>1439137856</TIMESTAMP>
<NATION>...</NATION>
<MESSAGE>
...
</MESSAGE>
</POST>
</MESSAGES>
</REGION>

我想要做的是从文件中的最后一个 POST 中提取 TIMESTAMP。有人可以告诉我我做错了什么吗?这可能非常明显,但我就是没看到。

【问题讨论】:

  • 你能粘贴错误信息吗?
  • @Douglas:评论太长,见pastebin.com/sKP4jFZ2
  • @TaW 我太笨了,对不起!我仍在我的 WebRequest 中使用测试密钥。谢谢你让我意识到呵呵!

标签: c# .net xml visual-studio webrequest


【解决方案1】:

问题在于您使用了错误的方法来检索&lt;TIMESTAMP&gt; 元素。 XElement.Elements 只返回 child 元素。在您的情况下,&lt;TIMESTAMP&gt; 是三层深,因此您需要改用 Descendants

ClassVars.LastTimeStamp = (int)root.Descendants("TIMESTAMP").Last();

【讨论】:

  • 我认为更好的选择是学习XPath 并给出子元素的路径。这是一个更稳定的解决方案。
  • @GreĝRos:我同意这将是更好的纪律,尤其是在路径验证很重要的情况下。另一方面,可能是 OP 不关心确切的 XML 结构,并且希望代码在结构发生变化时仍然可以工作。
  • @Douglas 是正确的 - 我使用的 API 确实改变了一个公平的交易,我并不真正关心结构 - 我只需要在我的代码。
【解决方案2】:

假设这是整个文档(除了标题),REGION 是根的唯一元素。 尝试改用 Descendants

【讨论】:

    猜你喜欢
    • 2012-07-02
    • 2012-10-09
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2019-04-26
    • 1970-01-01
    相关资源
    最近更新 更多