[英]Linq-to-xml group by elements that don't have child elements
我想知道是否有人可以幫助以下方面:
我有一個像這樣的xml文檔:
<div class="_cl">element description 1</div>
<div class="_cl">
<anotherele>dtls</anotherele>
<anotherele>moredtls</anotherele>
</div>
<div class="_cl">
<anotherele>dtls</anotherele>
<anotherele>moredtls</anotherele>
</div>
<div class="_cl">element description 2</div>
<div class="_cl">
<anotherele>dtls</anotherele>
<anotherele>moredtls</anotherele>
</div>
<div class="_cl">
<anotherele>dtls</anotherele>
<anotherele>moredtls</anotherele>
</div>
我想知道linq中是否可以通過沒有子元素的元素對此進行分組。 基本上,嘗試以某種方式構造文檔:
<div class="_cl">element description 1
<div class="_cl">
<anotherele>dtls</anotherele>
<anotherele>moredtls</anotherele>
</div>
<div class="_cl">
<anotherele>dtls</anotherele>
<anotherele>moredtls</anotherele>
</div>
</div>
<div class="_cl">element description 2
<div class="_cl">
<anotherele>dtls</anotherele>
<anotherele>moredtls</anotherele>
</div>
<div class="_cl">
<anotherele>dtls</anotherele>
<anotherele>moredtls</anotherele>
</div>
</div>
我的第一次悲慘嘗試是這樣的:
var n = from a in doc.Descendants()
where a.Name.LocalName == "div" && (string)a.Attribute("class") == "_cl"
group a by a.Value.Length<50 into g
select new { k = g.Key, p = g.Count() };
希望這是有道理的,並預先感謝。
斯圖
這是一個示例,假設輸入為
<body>
<div class="_cl">element description 1</div>
<div class="_cl">
<anotherele>dtls</anotherele>
<anotherele>moredtls</anotherele>
</div>
<div class="_cl">
<anotherele>dtls</anotherele>
<anotherele>moredtls</anotherele>
</div>
<div class="_cl">element description 2</div>
<div class="_cl">
<anotherele>dtls</anotherele>
<anotherele>moredtls</anotherele>
</div>
<div class="_cl">
<anotherele>dtls</anotherele>
<anotherele>moredtls</anotherele>
</div>
</body>
然后是代碼
XDocument input = XDocument.Load("input.xml");
XDocument output = new XDocument(
new XElement(input.Root.Name,
from el in input.Root.Elements()
where el.Elements().Any()
group el by el.NodesBeforeSelf().OfType<XElement>().LastOrDefault(e => !e.Elements().Any()) into g
select new XElement(g.Key.Name,
g.Key.Attributes(),
g.Key.Nodes(),
g)
));
output.Save(Console.Out);
輸出
<body>
<div class="_cl">element description 1<div class="_cl"><anotherele>dtls</anoth
erele><anotherele>moredtls</anotherele></div><div class="_cl"><anotherele>dtls</anotherele><anotherele>moredtls</anotherele></div></div>
<div class="_cl">element description 2<div class="_cl"><anotherele>dtls</anoth
erele><anotherele>moredtls</anotherele></div><div class="_cl"><anotherele>dtls</anotherele><anotherele>moredtls</anotherele></div></div>
</body>
除了縮進,我想這就是您想要的。 至於縮進,可以通過使用XDocument.Load("input.xml", LoadOptions.PreserveWhitespace)
加載輸入來更接近所需的結果。
有關此分組方法的更多信息,請參見http://msmvps.com/blogs/martin_honnen/archive/2009/11/27/grouping-with-linq-to-xml.aspx 。
斯瓦羅格是對的。 分組無法實現您要嘗試執行的操作。 您需要比Linq關鍵字中提供的更高級的Linq表達式。
嘗試這個:
var n = doc.Elements().Where(div=>!div.Elements().Any()).
Select(div=>{
div.Add(
div.ElementsAfterSelf().TakeWhile(x=>x.Elements().Any())
);
return div;
});
感謝您的投入,但似乎沒有一個解決方案能解決您的問題。 我認為我要做的就是循環遍歷元素並手動對其進行解析。 我只是認為一個不錯的linq單線會更好。
干杯
斯圖
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.