C# 读取xml,更新它并再次写入流,而无需全部加载
谢谢你的链接。我想到了这个C# 读取xml,更新它并再次写入流,而无需全部加载,c#,xml,C#,Xml,谢谢你的链接。我想到了这个 <?xml version="1.0" encoding="utf-8"?> <Root> <Movies> <Movie> <... attributes ...> </Movie> <Movie> <... attributes ...> </M
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Movies>
<Movie>
<... attributes ...>
</Movie>
<Movie>
<... attributes ...>
</Movie>
</Movies>
</Root>
}试着在这里调整一下模式:啊,你比我强。对不起:)我只是想在我知道是否能解决它之前问这个问题。这样别人也可以在找到答案时得到答案。
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Movies>
<Movie>
<... attributes ...>
</Movie>
<Movie>
<... attributes ...>
</Movie>
</Movies>
</Root>
class Program
{
static void WriteShallowNode(XmlReader reader, XmlWriter writer)
{
if (reader == null)
{
throw new ArgumentNullException("reader");
}
if (writer == null)
{
throw new ArgumentNullException("writer");
}
switch (reader.NodeType)
{
case XmlNodeType.Element:
writer.WriteStartElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
writer.WriteAttributes(reader, true);
if (reader.IsEmptyElement)
{
writer.WriteEndElement();
}
break;
case XmlNodeType.Text:
writer.WriteString(reader.Value);
break;
case XmlNodeType.Whitespace:
case XmlNodeType.SignificantWhitespace:
writer.WriteWhitespace(reader.Value);
break;
case XmlNodeType.CDATA:
writer.WriteCData(reader.Value);
break;
case XmlNodeType.EntityReference:
writer.WriteEntityRef(reader.Name);
break;
case XmlNodeType.XmlDeclaration:
case XmlNodeType.ProcessingInstruction:
writer.WriteProcessingInstruction(reader.Name, reader.Value);
break;
case XmlNodeType.DocumentType:
writer.WriteDocType(reader.Name, reader.GetAttribute("PUBLIC"), reader.GetAttribute("SYSTEM"), reader.Value);
break;
case XmlNodeType.Comment:
writer.WriteComment(reader.Value);
break;
case XmlNodeType.EndElement:
writer.WriteFullEndElement();
break;
}
}
public static bool Transform(XElement el)
{
el.Name = "a";
return true;
}
static void Main(string[] args)
{
XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreWhitespace = false;
var writer = XmlWriter.Create(File.OpenWrite(@"C:\dev\testout.xml"));
var reader = XmlReader.Create(File.OpenRead(@"C:\dev\test.xml"), readerSettings);
var flag = false;
while (reader.Read())
{
if (reader.Name == "Movie")
{
var el = (XElement)XNode.ReadFrom(reader);
if (Transform(el))
el.WriteTo(writer);
}
else
{
WriteShallowNode(reader, writer);
}
}