LINQ读取XML ...使用XDocument

时间:2012-02-14 20:02:41

标签: c# xml linq

以下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");

以这种方式解析Error标记:

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”)找到“&lt; error&gt;&lt; / error&gt;”

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

解答:
我只需要在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>();

......它有效!!!

2 个答案:

答案 0 :(得分:4)

听起来你真的只想要error元素,这些元素的子元素为errorcodeerrormessage。怎么样:

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>

答案 1 :(得分:1)

您可以使用where运算符过滤掉空错误,该运算符会检查与IsEmpty对应的每个XElement的{​​{1}}属性:

<error>