2017-04-17 50 views
0

我想在这个XML片段中读取并更改attr2的名称和值,并保持其他所有方式。只是想读取XML片段,并改变一些东西

如何在下面的else子句中按原样读取和写入其他元素?另外,如果有更好的方法来做到这一点,我欢迎这样的想法!

string xmlFragment = @" 
    <blah>...</blah> 
    <more attr='blah' /> 
    <fragment attr1='value1' /> 
    <fragment attr2='value2' attr3='value3' /> 
    "; 

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ConformanceLevel = ConformanceLevel.Fragment; 

using (XmlReader reader = XmlReader.Create(new StringReader(xmlFragment), settings)) 
using (var stream = new MemoryStream()) 
{ 
    var sw = new StreamWriter(stream); 

    while (reader.Read()) 
    { 
     if (reader.NodeType == XmlNodeType.Element && reader.Name == "fragment") 
     { 
      if (reader.GetAttribute("attr2") != null) 
      { 
       //change this element 
       string test = reader.GetAttribute("attr2"); 
       sw.Write("<fragment attr2Upd='value2Upd' attr3='value3' />"); 
      } 
     } 
     else 
     { 
      //copy the element the way it is. 
      //how do I copy the current element to StreamWriter as-is 
     } 
    } 

    sw.Flush(); 
    stream.Position = 0; 

    using (var streamReader = new StreamReader(stream)) 
    { 
     string test = streamReader.ReadToEnd(); 
    } 
} 

回答

0

写节点基于节点类型:

switch (reader.NodeType) { 
     case XmlNodeType.Element: 
      sw.Write(string.Format("<{0}>", reader.Name)); 
      break; 
     case XmlNodeType.Text: 
      sw.Write(reader.Value); 
      break; 
     case XmlNodeType.CDATA: 
      sw.Write(string.Format("<![CDATA[{0}]]>", reader.Value)); 
      break; 
     case XmlNodeType.ProcessingInstruction: 
      sw.Write(string.Format("<?{0} {1}?>", reader.Name, reader.Value)); 
      break; 
     case XmlNodeType.Comment: 
      sw.Write(string.Format("<!--{0}-->", reader.Value)); 
      break; 
     case XmlNodeType.XmlDeclaration: 
      sw.Write("<?xml version='1.0'?>"); 
      break; 
     case XmlNodeType.Document: 
      break; 
     case XmlNodeType.DocumentType: 
      sw.Write(string.Format("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value)); 
      break; 
     case XmlNodeType.EntityReference: 
      sw.Write(reader.Name); 
      break; 
     case XmlNodeType.EndElement: 
      sw.Write(string.Format("</{0}>", reader.Name)); 
      break; 
    } 

参考:MSDN - XmlReader.Read Method