0

我有一个 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 class="red">ipsum</span>. 如果两个相邻的跨度具有不同的类,则它们必须保持原样。

我怎么能用 C# 做到这一点?

4

1 回答 1

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

这可能足以满足您的目的,但它有一个主要限制:它将破坏要删除的跨度中的任何子节点。只有文本将被保留并与第一个跨度合并。

于 2013-03-29T10:07:01.197 回答