2015-11-05 55 views
1

我有一大块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数据的数据流提供给我,我的直觉告诉我需要XmlTextReaderXmlTextWriter

我最初的想法是通过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数据?

+0

的 'W' 称为前缀并且由命名空间中定义:XMLNS:W =“http://schemas.openxmlformats.org/wordprocessingml/ 2006 /主”。你想做什么?该文档不需要清理以反序列化。 – jdweng

+0

@jdweng我知道一个名字空间是什么:-)。我并不想解决反序列化问题。我试图找到替换Xml数据中某些元素值的“最佳”方法。 –

+0

使用XDocument(xml linq)。查找标签,然后简单地替换值。 – jdweng

回答

0

尝试此

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"; 
 
      } 
 

 
     } 
 
    } 
 
} 
 
​

+0

为什么你都喜欢XDocument?这是非常缓慢和渴望内存 – vitalygolub

+0

它比XmlDocument好得多吗? XDocument是更少的指令,更容易提取标签。 – jdweng

相关问题