我有XML(不完全是这么简单但只是我的问题)。
如果我的代码如下
var xdoc = XDocument.Parse(@"
<Root>
<Item>
<Node1>Value 1</Node1>
<Node2>Value 2</Node2>
<Node3>Value 3</Node3>
<Node4>Value 4</Node4>
<Node5>Value 5</Node5>
<Node6>Value 6</Node6>
</Item>
</Root>");
var results = xdoc.Root
.Elements("Item")
.Descendants()
.Select(e => new { ElementName = e.Name, ElementValue = e.Value });
这将为我提供“Item”元素的所有后代(节点名称和节点值)的结果列表。我想问的是如何根据条件获得不同的数据集。例如,如果Node1或Node2有一个值(非空),那么我只想要Node1和Node2的结果列表(节点名称和值),否则结果列表应该显示其他节点,即Node3,Node4,Node5和Node6(节点名称和值)。请帮忙。谢谢。
答案 0 :(得分:0)
你的条件相当......奇怪。
var query =
from item in doc.Root.Elements("Item")
let elements = item.Elements()
let firstTwo = elements.Take(2)
let descendants = firstTwo.All(e => !String.IsNullOrWhiteSpace(e.Value))
? firstTwo.DescendantsAndSelf()
: elements.Skip(2).DescendantsAndSelf()
from e in descendants
select new
{
ElementName = e.Name,
ElementValue = e.Value,
};
答案 1 :(得分:0)
我不确定我完全理解你的问题。但是,如果我说得对,那么你需要添加的就是这样的条件:
if (condition)
results = results.Take(2);
else
results = results.Skip(2);
因此,如果condition
为真,那么结果序列中只有前2个节点。如果condition
为假,那么您将只剩下剩余的元素。
我对您的问题的第一个解释是您需要在查询中添加对Where
的调用,以便您只有实际包含结果集值的元素。这看起来像这样:
var results = xdoc.Root
.Elements("Item")
.Descendants()
.Where(e => !string.IsNullOrEmpty(e.Value))
.Select(e => new { ElementName = e.Name, ElementValue = e.Value });