2011-04-28 27 views
6

所以這是我的情況。如何從字符串更新/替換XElement的元素?

我有一個XElement,我們稱之爲根,它有後代,後代等。我使用LINQ將一個後代拉到XML中,使用.ToString()將其加載到備忘錄編輯器中並對其進行編輯。現在我想用編輯後的版本更新/替換原有的後代元素。

讓我來提一下,這是一個簡單的XML文件,沒有模式,不使用DOM等。我只需要能夠編輯和更新/替換元素。

這裏是我的XML的樣機:

<Root> 
    <Genre Name="Rock"> 
    <Artist Name="Pink Floyd"> 
     <BandMembers> 
     <Member>Nick Mason</Member> 
     <Member>Syd Barret</Member> 
     <Member>David Gilmour</Member> 
     <Member>Roger Water</Member> 
     <Member>Richard Wright</Member> 
     </BandMembers> 
     <Category>Favorite band of all time</Category> 
    </Artist> 
    <Artist Name="Led Zepelin"> 
     <Category>Love the band</Category> 
    </Artist> 
    </Genre> 
    <Genre Name="Blues"> 
    <Artist Name="Muddy Waters"> 
     <Instrument>Harmonica</Instrument> 
    </Artist> 
    <Artist Name="Howling Wolf"> 
     <Instrument>Guitar</Instrument> 
    </Artist> 
    </Genre> 
</Root> 

現在說我要編輯「平克·弗洛伊德」元素糾正羅傑·沃特斯姓。我得到該元素,將其轉換爲字符串,將其加載到我的編輯器中,進行我想要的更改,然後使用.Parse()將其轉換回XElement。

現在,我如何更新/替換我的原始XML中的「Pink Floyd」節點?

+1

我更新了XML,因爲它有一些不匹配的名稱和缺少的項目。這是一個有效的結構,但它仍然不完全一致,藝術家在體裁之外發生。 – 2011-04-28 15:58:11

+1

我更新了XML,將Muddy和Howling添加到Blues 標記中。現在他們回家了! ;) – pmartin 2011-04-28 17:36:44

+0

哎呀!這就是我爲了自由處理XML而得到的。 =) – 2011-05-02 15:56:56

回答

11

您可以使用XElement.ReplaceWith method

// input would be your edited XML, this is just sample data to illustrate 
string input = @"<Artist Name=""Pink Floyd""> 
    <BandMembers> 
    <Member>Nick Mason</Member> 
    <Member>Syd Barret</Member> 
    <Member>David Gilmour</Member> 
    <Member>Roger Waters</Member> 
    <Member>Richard Wright</Member> 
    </BandMembers> 
    <Category>Favorite band of all time</Category> 
</Artist>"; 

var replacement = XElement.Parse(input); 
var pinkFloyd = xml.Elements("Genre") 
        .Where(e => e.Attribute("Name").Value == "Rock") 
        .Elements("Artist") 
        .Single(e => e.Attribute("Name").Value == "Pink Floyd"); 

pinkFloyd.ReplaceWith(replacement); 
Console.WriteLine(xml); 

您應該添加一些錯誤,雖然檢查。我使用Single,因爲我確定該節點存在,但如果有機會,則不應在使用結果前使用SingleOrDefault並檢查null。此外,如果輸入無效,則需要將上面的代碼包裝在try/catch中,並處理可能拋出的任何XmlException

+0

這正是我所期待的。我不知道我是如何錯過「ReplaceWith」的,因爲它完全按照我想要執行的操作命名。而我的應用程序在嘗試保存編輯後的文本時確實檢查了XmlException。謝謝。 – 2011-04-28 18:36:51