我有一个类似以下的XML节点:
<p>
Lorem <span class="red">ipsu</span><span class="red">m</span> dolor sit amet,
<span class="green">consectetur</span><span class="bold">adipiscingelit</span>.
</p>
观察到“ipsum”这个词被分成两个相似的span标签。我想将这些元素合并到<span class="red">ipsum</span>
之类的内容中。如果两个相邻的跨度具有不同的类别,则它们必须保持原样。
我怎样才能用C#做到这一点?
答案 0 :(得分:0)
使用Linq to XML(有点笨重):
//elem is an XElement containing the XML
var duplicateRanges = (
from head in elem.Elements()
let currentClass = (string)head.Attribute("class")
let others = head.ElementsAfterSelf().TakeWhile(next => {
if (next.NodesBeforeSelf().LastOrDefault().NodeType == XmlNodeType.Text) { return false; }
return (string)next.Attribute("class") == currentClass;
})
where others.Any()
select new {
head,
others
}).ToList();
foreach (var range in duplicateRanges) {
range.head.Value=(string)range.head + String.Join("", from o in range.others select (string)o);
foreach (var other in range.others) {
other.Remove();
}
}
这可能足以满足您的目的,但它有一个主要限制:它将销毁要移除的跨度中的所有子节点。只保留文本并将其与第一个范围合并。