如何合并具有相同类的两个相邻XML元素?

时间:2013-03-29 07:26:32

标签: c# xml

我有一个类似以下的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#做到这一点?

1 个答案:

答案 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();
    }
}

这可能足以满足您的目的,但它有一个主要限制:它将销毁要移除的跨度中的所有子节点。只保留文本并将其与第一个范围合并。