2011-04-28 5 views
6

내 경우는 여기에 있습니다.문자열에서 XElement의 요소를 업데이트/대체하려면 어떻게해야합니까?

저는 XElement를 가지고 있습니다. 자손이있는 자손이있는 루트라고 부르 자. LINQ to XML을 사용하여 자손을 당겨 .ToString()을 사용하여 메모 편집기에로드하고 편집합니다. 이제 원래의 하위 요소를 편집 된 버전으로 업데이트/대체하려고합니다.

이 파일은 스키마가없고 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> 

가 지금은 로저 워터스 '성을 해결하기 위해'핑크 플로이드 (Pink Floyd) "요소를 편집 할 말 :

여기 내 XML의 모형입니다. 그 요소를 가져 와서 문자열로 변환하고, 편집기로로드하고, 원하는대로 변경하고, .Parse()을 사용하여 XElement로 다시 변환합니다.

이제 원래의 XML에서 "Pink Floyd"노드를 업데이트하거나 바꿀 수 있습니까?

// 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); 

당신은 몇 가지 오류가 있지만 검사를 추가해야합니다 :

+1

일치하지 않는 이름과 누락 된 항목이 있으므로 XML을 업데이트했습니다. 이것은 유효한 구조이지만 여전히 일관성이 없으며 장르 밖에서 일어나는 예술가들과도 같습니다. –

+1

나는 BLOOD 태그 안에 Muddy와 Howling을 넣기 위해 XML을 업데이트했다. 이제 그들은 집에있어! ;) – pmartin

+0

죄송합니다. 바로 XML을 자유롭게 사용하기 위해서입니다. =) –

답변

11

당신은이 XElement.ReplaceWith method 사용할 수 있습니다. 나는 노드가 존재한다고 확신하기 때문에 Single을 사용했지만, 기회가 있다면 SingleOrDefault을 사용해야하고 결과를 사용하기 전에 null을 확인해야합니다.

또한 입력이 유효하지 않은 경우 위의 코드를 try/catch에 랩핑하고 throw 될 수있는 XmlException을 처리해야합니다.

+0

바로 그게 내가 찾고있는 것입니다. "ReplaceWith"를 놓친 이유를 정확히 모르겠다. 그리고 내 애플은 편집 된 텍스트를 저장할 때 XmlException을 체크한다. 감사. –

관련 문제