2010-02-25 58 views
1

我有下面的XML作爲一個IQueryable傳遞給方法,即的LINQ to XML,更換子節點,但保持狀態

XML:

<body> 
    <p>Some Text</p> 
    <p>Some Text</p> 
    <pullquote>This is pullquote</pullquote> 
    <p>Some Text</p> 
    <p>Some Text</p> 
<body> 

方法:

public static string CreateSection(IQueryable<XElement> section) 
{ 
    var bodySection = from b in articleSection.Descendants("body") 
         select b; 

    //Do replacement here. 

    var bodyElements = bodySection.Descendants(); 

    StringBuilder paragraphBuilder = new StringBuilder(); 
    foreach (XElement paragraph in bodyElements) 
    { 
     paragraphBuilder.Append(paragraph.ToString()); 
    } 

    return paragraphBuilder.ToString(); 
} 

我想完成的是將<pullquote>替換爲<p>(也可能是添加屬性)。

我的問題不是實際的替換(XElement.ReplaceWith()),而是替換之後的更改並不反映StringBuilder使用的bodySection變量。

我該如何去解決這個問題?

回答

1

你還沒有真正顯示出足夠的代碼 - 尤其是你還沒有顯示的替換代碼你是嘗試使用

但是,我懷疑主要問題是bodySection是一個查詢。每次使用它時,它都會再次查詢section - 如果這是從數據庫中提取信息,那就這樣吧。您可能會發現,這是所有的需要讓它做你想要什麼:

var bodySection = articleSection.Descendants("body").ToList(); 

這樣,那麼你已經有了在閥體內存部分,並使用bodySection任何時候,你就可以使用相同的收集對象,而不是再次查詢。

+0

你是對的,使用整個集合列表似乎是唯一的解決方案 – 2010-02-25 06:31:54

+0

@BK:嚴格地說,它不一定是'List ' - 任何實現查詢並保持結果的東西都可以。實際存儲是一個實現細節 - 但列表是最簡單的方法。 – 2010-02-25 07:07:34

0

這將是更好地使用XML Tramsformation,看here對於如何做到這一點,併爲here XSL語法

+0

使用XSL進行XML轉換在這裏不是一個真正的選擇,它會違背已經完成的所有事情。 – 2010-02-25 06:01:53

+0

我看到這個工作的唯一方法是將整個集合轉換爲列表()並從那裏使用它 – 2010-02-25 06:09:26