我有一大块XML数据,我需要“干净”。在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>
-elements和替换用别的东西的价值。我需要清理的元素将散布在整个文档中。
我需要代码尽可能快地运行,并且内存占用尽可能小,所以我不愿意使用我在这里和其他地方找到的XDocument
(DOM)方法。
数据作为包含Xml数据的数据流提供给我,我的直觉告诉我需要XmlTextReader
和XmlTextWriter
。
我最初的想法是通过Xml数据做一个SAX模式,只进行前向运行,并将其“管道”到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);
}
}
上面的代码只需要申报要素等方面的价值,所以没有括号或任何东西。我意识到我可以编写专门执行.WriteElement()
,.WriteEndElement()
等的代码,这取决于NodeType
,但我担心这很快就会变得一团糟。
所以,问题是:
如何 - 在一个不错的方式 - 管从XmlTextReader
读取到XmlTextWriter
同时仍然能够操纵而管道中的数据的XML数据?
的 'W' 称为前缀并且由命名空间中定义:XMLNS:W =“http://schemas.openxmlformats.org/wordprocessingml/ 2006 /主”。你想做什么?该文档不需要清理以反序列化。 – jdweng
@jdweng我知道一个名字空间是什么:-)。我并不想解决反序列化问题。我试图找到替换Xml数据中某些元素值的“最佳”方法。 –
使用XDocument(xml linq)。查找标签,然后简单地替换值。 – jdweng