簡體   English   中英

替換xml流中文本的最有效方法

[英]Most efficient way to replace text in xml stream

我需要“清理”大量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數據的流的形式提供給我,我的直覺告訴我我需要XmlTextReaderXmlTextWriter

我最初的想法是做一個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"; } } } }​ 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM