我只是在学习LINQ,特别是LINQ to XML,我写了一个有效的查询,但我想知道我是不是有点回合。代码可以改进吗?
我有一个XDocument:
<SomeDocument>
<Prop1> val1 </Prop1>
<Prop2> val2 </Prop2>
<Prop3> val3 </Prop3>
</SomeDocument>
但Prop1,Prop2和Prop3可能不存在。可能还有其他XDocuments,我将用相同的代码解析,它们完全具有不同的属性。但是我只对XDocument感兴趣,如果它有Prop1或Prop1和Prop2。
var query = from n in xml.Elements()
where n.Name == "Prop1" || n.Name == "Prop2"
select new {n.Name, n.Value};
string prop1 = null;
string prop2 = null;
foreach (var n in query)
{
if (n.Name == "Prop1") prop1 = n.Value;
if (n.Name == "Prop2") prop2 = n.Value;
}
if (string.IsNullOrEmpty(prop1)) { //error }
if (string.IsNullOrEmpty(prop2)) { DoMethod1(prop1); }
else { DoMethod2(prop1, prop2); }
查询后的代码对我来说似乎太长了,虽然我不确定是否有更好的方法来做我正在尝试做的事情。找到1或2个显式节点,并根据找到的节点(如果有)调用相关方法。
答案 0 :(得分:2)
我亲自使用:
var element = xml.Element("prop1");
if (element!= null)
{
//The element exists, now do things on it!
if(string.IsNullOrEmpty(element.Value)) {DoMe(element.Value);}
}
如果您已经命名了您知道的属性(元素),则只需命名它们即可返回。这也节省了额外的循环(至少在你的代码中)
答案 1 :(得分:2)
如果将结果分解为查找,你可能会消除中间部分,即:
string[] propNames = new[] { "Prop1", "Prop2" };
var props = (from n in xml.Elements()
where propNames.Contains(n.Name)
select new { n.Name, n.Value })
.ToLookup(e => e.Name, e => e.Value);
if (props.Contains("Prop1")) { ... }
if (props.Contains("Prop2")) { ... }
// etc.
这取决于你对这些信息做了什么改进,但至少它有点干净。