2011-08-25 110 views
4

這個什麼字符串中的數據是這樣的:從寫入字符串的xml文件中移除標籤?

<temp><id>TGPU1</id><label>GPU</label><value>67</value></temp><temp><id>THDD1</id><label>ST3320620AS</label><value>34</value></temp><temp><id>FCPU</id><label>CPU</label><value>1430</value></temp> 

(有更多,這僅僅是原始輸出的一個小剪斷。) 我想要做的是通過一些快速餵它代碼(不是在實際的代碼是怎麼長,但它需要多長時間來執行計算),將刪除所有

<temp><id>TGPU1</id><label>GPU</label><value> 

,並輸出到一個新的字符串,只有所有的<value>的之間的值和</value>的。即時尋找像字符串輸出:67341430.
,我發現這個代碼:

bool FoundMatch = false; 

try { 
    Regex regex = new Regex(@"<([be])pt[^>]+>.+?</\1pt>"); 
    while(regex.IsMatch(yourstring)) { 
      yourstring = regex.Replace(yourstring, ""); 
    } 
} catch (ArgumentException ex) { 
    // Syntax error in the regular expression 
} 

,但它僅刪除< * PT>其中冷改爲除去別的東西。但它一次只能刪除一個標籤。如果我必須刪除所有標籤,速度不是很快。

感謝

PS,如果你想知道的,下面的代碼的代碼我期待這個增加。這也是印刷原始字符串上面提到的代碼:

static void Main(string[] args) 
{ 
    Console.WriteLine("Memory mapped file reader started"); 

    using (var file = MemoryMappedFile.OpenExisting("sensor")) 
    { 
     using (var reader = file.CreateViewAccessor(0, 3800)) 
     { 
      var encoding = Encoding.ASCII; 
      Console.WriteLine(encoding.GetString(bytes)); 
     } 
    } 

    Console.WriteLine("Press any key to exit ..."); 
    Console.ReadLine(); 
} 
+0

您應該更好地將XML加載到XElement中進行操作。這樣做會更簡單。 –

回答

4

你可以使用LINQ:如果你真的關心性能

String.Concat(
    XElement.Parse(...) 
      .Descendants("value") 
      .Select(v => v.Value) 
); 

,你可以使用XmlReader直接閱讀通過<value>標籤並追加到StringBuilder
但是,這不值得,除非你的XML數百兆字節大。

+0

你能解釋每一行嗎?我對嗎?:它選擇字符串之間的值?但是它對它有什麼作用?謝謝。 – Csharpz

+0

它'Concat's他們。 – SLaks

+0

嘿嗯它編譯得很好,但由於它更多的是一串數據而不是一個XML文件,它沒有一個根。那個樣本就是整個事物看起來像是用不同的值重複的。 – Csharpz