2013-03-29 90 views
0

我有一個像下面的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> 

注意單詞「文字」被分隔成兩個類似的跨度標籤。我想將這些元素合併到<span class="red">ipsum</span>之類的東西中。如果兩個相鄰的跨度類別不同,則它們必須保持原樣。

我該怎麼用C#做到這一點?

+1

您是否嘗試過XSLT? –

+2

你已經嘗試過任何東西嗎? – MarcinJuraszek

+0

我不知道任何嘗試的起點。 如果按類名得到元素,我不知道元素是否相鄰。如果我用正則表達式找到並替換了'',我不能確定''是否屬於相似類型的跨度。 – sevenkul

回答

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

這可能足以爲你的目的,但它有一個主要的限制:它會破壞任何的子節點的跨度被刪除。只有文本將被保留並與第一個跨度合併。

+0

謝謝,它按預期工作。 – sevenkul

相關問題