gpt4 book ai didi

c# - XmlReader - 我需要编辑一个元素并生成一个新元素

转载 作者:数据小太阳 更新时间:2023-10-29 01:44:41 24 4
gpt4 key购买 nike

我正在覆盖一个传入了 XmlReader 的方法,我需要找到一个特定的元素,添加一个属性,然后创建一个新的 XmlReader 或只用修改后的内容替换现有的。我正在使用 C#4.0

我研究过使用 XElement (Linq),但我似乎无法操作现有元素并添加属性和值。

我知道 XmlWriter 有 WriteAttributeString 这会很棒,但我还是不确定它们是如何组合在一起的

我希望能够做一些像 --- 这是伪代码!

public XmlReader DoSomethingWonderful(XmlReader reader)
{
Element element = reader.GetElement("Test");
element.SetAttribute("TestAttribute","This is a test");
reader.UpdateElement(element);
return reader;
}

最佳答案

XmlReader/Writer 是顺序访问流。您将必须在一端读入,按照您的需要处理流,然后在另一端将其写出。优点是您不需要将整个内容读入内存并构建 DOM,这是您使用任何基于 XmlDocument 的方法所获得的。

这个方法应该让你开始:

private static void PostProcess(Stream inStream, Stream outStream)
{
var settings = new XmlWriterSettings() { Indent = true, IndentChars = " " };

using (var reader = XmlReader.Create(inStream))
using (var writer = XmlWriter.Create(outStream, settings)) {
while (reader.Read()) {
switch (reader.NodeType) {
case XmlNodeType.Element:
writer.WriteStartElement(reader.Prefix, reader.Name, reader.NamespaceURI);
writer.WriteAttributes(reader, true);

//
// check if this is the node you want, inject attributes here.
//

if (reader.IsEmptyElement) {
writer.WriteEndElement();
}
break;

case XmlNodeType.Text:
writer.WriteString(reader.Value);
break;

case XmlNodeType.EndElement:
writer.WriteFullEndElement();
break;

case XmlNodeType.XmlDeclaration:
case XmlNodeType.ProcessingInstruction:
writer.WriteProcessingInstruction(reader.Name, reader.Value);
break;

case XmlNodeType.SignificantWhitespace:
writer.WriteWhitespace(reader.Value);
break;
}
}
}
}

这不像派生您自己的 XmlWriter 那样干净,但我发现它更容易。

[编辑]

关于如何同时打开两个流的示例可能是这样的:

using (FileStream readStream = new FileStream(@"c:\myFile.xml", FileMode.OpenOrCreate, FileAccess.Read, FileShare.Write)) {
using (FileStream writeStream = new FileStream(@"c:\myFile.xml", FileMode.OpenOrCreate, FileAccess.Write)) {
PostProcess(readStream, writeStream);
}
}

关于c# - XmlReader - 我需要编辑一个元素并生成一个新元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1502450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com