繁体   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