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」という単語が 2 つの類似した span タグに分かれていることに注意してください。そのような要素を のようなものにマージしたい<span class="red">ipsum</span>。隣接する 2 つのスパンのクラスが異なる場合は、そのままにしておく必要があります。

どうすれば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 に答える