以下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>();
......它有效!!!
答案 0 :(得分:4)
听起来你真的只想要error
元素,这些元素的子元素为errorcode
和errormessage
。怎么样:
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();
(我已经猜到了ElementValueInt
和ElementValueString
做了什么,虽然我认为内置转换可能是一个更好的主意。我不知道ToListSafely
做了什么。 ..如果你包括这类东西会有所帮助......)
这样您就不会最终为元素创建错误,例如:
<error><unrelated /></error>
答案 1 :(得分:1)
您可以使用where
运算符过滤掉空错误,该运算符会检查与IsEmpty
对应的每个XElement
的{{1}}属性:
<error>