替换xml流中文本的最有效方法
本文关键字:有效 方法 文本 xml 中文 替换 | 更新日期: 2023-09-27 18:20:34
我有一大块XML数据需要"清理"。Xml看起来像这样:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:t>F_ck</w:t>
<!-- -->
<w:t>F_ck</w:t>
<!-- -->
<w:t>F_ck</w:t>
</w:p>
</w:body>
</w:document>
我想用值"F_ck"标识<w:t>
-元素,并用其他值替换该值。我需要清理的元素将分散在整个文档中。
我需要代码以尽可能快的速度运行,并且内存占用尽可能小,所以我不愿意使用我在这里和其他地方找到的XDocument
(DOM)方法。
数据作为包含Xml数据的流提供给我,我的直觉告诉我需要XmlTextReader
和XmlTextWriter
。
我最初的想法是做一个SAX模式,只向前运行Xml数据,并将其"管道"传输到XmlTextWriter
,但我找不到一种智能的方法来做到这一点
我写了这个代码:
var reader = new StringReader(content);
var xmltextReader = new XmlTextReader(reader);
var memStream = new MemoryStream();
var xmlWriter = new XmlTextWriter(memStream, Encoding.UTF8);
while (xmltextReader.Read())
{
if (xmltextReader.Name == "w:t")
{
//xmlWriter.WriteRaw("blah");
}
else
{
xmlWriter.WriteRaw(xmltextReader.Value);
}
}
上面的代码只接受元素声明等的值,所以没有括号或任何东西。我意识到我可以根据NodeType
编写专门执行.WriteElement()
、.WriteEndElement()
等的代码,但我担心这很快就会一团糟。
所以问题是:
如何以一种很好的方式将从XmlTextReader
读取的xml数据管道传输到XmlTextWriter
,同时仍然能够在管道传输时操作数据?
试试这个
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string xml =
"<?xml version='"1.0'" encoding='"utf-8'" standalone='"yes'"?>" +
"<w:document xmlns:w='"http://schemas.openxmlformats.org/wordprocessingml/2006/main'">" +
"<w:body>" +
"<w:p>" +
"<w:t>F_ck</w:t>" +
"<!-- -->" +
"<w:t>F_ck</w:t>" +
"<!-- -->" +
"<w:t>F_ck</w:t>" +
"</w:p>" +
"</w:body>" +
"</w:document>";
XDocument doc = XDocument.Parse(xml);
XElement document = (XElement)doc.FirstNode;
XNamespace ns_w = document.GetNamespaceOfPrefix("w");
List<XElement> ts = doc.Descendants(ns_w + "t").ToList();
foreach (XElement t in ts)
{
t.Value = "abc";
}
}
}
}