我希望我的XElements按文档顺序排列。
我可以在此示例中使用Join重新排序xpathGroups
吗?
XDocument message_doc = XDocument.Load(message);
var xpathGroups =
from e in contextErrors
group e by SelectElement(message_doc, e.XPath) into g
select new
{
Element = g.Key,
ErrorItems = g,
};
var documentOrderedGroups =
from elem in message_doc.Root.DescendantsAndSelf()
join e in xpathGroups on elem equals e.Element
select e;
消息:
<root>
<a>
<aa>
<aaa>9999</aaa>
</aa>
<aa>
<aaa>8888</aaa>
</aa>
</a>
<b>
<bb>
<bbb>7777</bbb>
</bb>
</b>
<c>
<cc>
<ccc>6666</ccc>
</cc>
</c>
</root>
输入数据:
/root/c[1]/cc[1]/ccc[1]
/root/a[1]/aa[2]/aaa[1]
/root/b[1]/bb[1]/bbb[1]
/root/a[1]/aa[1]/aaa[1]
预期结果:
/root/a[1]/aa[1]/aaa[1]
/root/a[1]/aa[2]/aaa[1]
/root/b[1]/bb[1]/bbb[1]
/root/c[1]/cc[1]/ccc[1]
答案 0 :(得分:1)
您的原始查询有效,结果是一个对象,其元素及其相关的XPath查询按文档顺序排列。但是,结果与您所做的注释冲突,您只想按文档顺序排列元素。
元素和XPath:如果你想要元素及其XPath,那么连接将作为查询的一部分保留,但我会用投影替换分组为匿名类型。
var xpathElements = contextErrors.Select(e => new
{
Element = message_doc.XPathSelectElement(e.XPath),
XPath = e.XPath
});
var ordered = from e in message_doc.Descendants()
join o in xpathElements on e equals o.Element
select o;
仅限元素:如果您只希望元素按文档顺序排列,则以下方法也可以使用。
var xpathElements = contextErrors.Select(e => message_doc.XPathSelectElement(e.XPath));
var ordered = message_doc.Descendants()
.Where(e => xpathElements.Any(o => e == o));
在这两个例子中,我都用XPathSelectElement method
取代了你的位置
我收集的SelectElement
方法具有相同的目的。