我有一大塊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