2012-10-15 5 views
0

XML 문서를 업데이트하고 문자열에 업데이트 된 XML을 반환해야합니다. 나는 아래처럼 노력하고있다. 문서를 저장할 때 파일 이름이 필요합니다. 하지만 난 파일로 저장하고 싶지 않아. 난 그냥 문자열에 업데이트 된 XML을 원한다. 캐릭터는 불변이기 때문에C#을 사용하여 XMLDocument를 업데이트하는 방법은 무엇입니까?

 string OldXml = @"<Root> 
            <Childs> 
            <first>this is first</first> 
            <second>this is second </second> 
            </Childs   
            </Root>"; 

     XmlDocument NewXml = new XmlDocument(); 
     NewXml.LoadXml(OldXml); 

     XmlNode root = NewXml.DocumentElement; 
     XmlNodeList allnodes = root.SelectNodes("*"); 

     foreach (XmlNode eachnode in allnodes) 
     { 
      if (eachnode.Name == "first") 
      { 
       eachnode.InnerText = "1"; 
      } 
     } 

     NewXml.Save(); 
     string newxml = NewXml.OuterXml; 

답변

1

당신은 Save method를 호출 할 필요는 없다, 문제가 root.SelectNodes("*")에, 그냥 자식 노드, 노드의 모든 수준을 얻는다. 당신은 하나 개 더 수준 갈 필요가 :

foreach (XmlNode eachnode in allnodes) 
     { 
      var firstNode = eachnode.ChildNodes.Cast<XmlNode>() 
           .SingleOrDefault(node => node.Name == "first"); 
      if (firstNode != null) 
      { 
       firstNode.InnerText = "1"; 
      } 
     } 


    string newxml = NewXml.OuterXml; 

이 될 것이라고 강하게 XML에 LINQ를 사용하여 권장, 그것은 간단 :

var xDoc = XDocument.Parse(OldXml); 
foreach (var element in xDoc.Descendants("first")) 
    element.SetValue(1); 

string newXml = xDoc.ToString(); 
0

귀하의 반복 "첫째"라는 노드에 도달하지 않습니다. 그렇지 않으면 NewXml을 저장하지 않고도 정상적으로 작동합니다.

그러나 XElement을 사용하고 모든 자손에 대해 반복 할 수 있습니다.

string OldXml = @"<Root> 
         <Childs> 
         <first>this is first</first> 
         <second>this is second </second> 
         </Childs>   
         </Root>"; 

      var NewXml = XElement.Parse(OldXml); 
      foreach (var node in NewXml.Descendants()) 
      { 
       if (node.Name.LocalName == "first") 
       { 
        node.Value = "1"; 
       } 
      } 
      var reader = NewXml.CreateReader(); 
      reader.MoveToContent(); 
      string newxml = reader.ReadInnerXml(); 
관련 문제