【问题标题】:LINQ reading XML ...with XDocumentLINQ 读取 XML ...使用 XDocument
【发布时间】:2012-02-14 20:02:41
【问题描述】:

以下 XML 可能包含错误。
如果不是,结果仍然输出 标签。

string xml = 
  "<response>
      <total>1</total>
      <bla>bla bla bla</bla>
      <error></error>
   </response>";

在我的代码中,我以这种方式加载 xml:

XDocument doc = XDocument.Parse(xml);  
XElement responseNode = doc.Element("response");

并以这种方式解析错误标记:

List<Error> Errors = (from w in doc.Descendants("error")
           select new Error
           {
               ErrorCode = w.ElementValueInt("errorcode"),
               ErrorMessage = w.ElementValueString("errormessage")
           }).ToListSafely<Error>();

问题:
当没有错误时,我仍然得到 Count = 1,
因为 doc.Descendants("error") 找到了 ""

有没有办法告诉 LINQ 代码排除空节点
加载和解析节点时?

回答:
我只需要在 LINQ 上添加“where (w.HasElements)”,所以

 List<Error> Errors = (from w in doc.Descendants("error")
       where (w.HasElements)
       select new Error
       {
           ErrorCode = w.ElementValueInt("errorcode"),
           ErrorMessage = w.ElementValueString("errormessage")
       }).ToListSafely<Error>();

...它的工作原理!!!

【问题讨论】:

  • 您可以在下面的字段中回答您自己的问题,然后将其标记为正确 - 这在 SO 上是可以接受的。阻止人们查看认为未回答的问题,并邀请希望查看已回答问题的人。

标签: c# xml linq


【解决方案1】:

听起来你真的只想要具有errorcodeerrormessage 子元素的error 元素。这个怎么样:

var errors = (from element in doc.Descendants("error")
              let code = (int?) element.Element("errorcode")
              let message = (string) element.Element("errormessage")
              where code != null && message != null
              select new Error {ErrorCode = code.Value, ErrorMessage = message})
             .ToList();

(我猜到 ElementValueIntElementValueString 做了什么,虽然我认为内置转换可能是一个更好的主意。我不知道 ToListSafely 做了什么......如果你会包括这种东西......)

这样您最终不会为以下元素创建错误:

<error><unrelated /></error>

【讨论】:

    【解决方案2】:

    您可以通过使用where 运算符来过滤空错误,该运算符检查每个XElement 对应于&lt;error&gt;IsEmpty 属性:

    List<Error> Errors = 
        (
            from w in doc.Descendants("error")
            where !w.IsEmpty
            select new Error
            {
                ErrorCode = w.ElementValueInt("errorcode"),
                ErrorMessage = w.ElementValueString("errormessage")
            }
        ).ToListSafely<Error>();
    

    【讨论】:

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