2011-08-25 112 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