2015-11-05 79 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