如何将值写入字符串然后返回?

时间:2011-09-07 03:55:24

标签: c# xml string class

我有一个定时器,每秒循环一次代码。这段代码一个接一个地读取几个xml片段,然后将它们打印到屏幕上,然后在一秒钟之后再重复一遍。输出:

34,
23,
12,

我想要做的是将所有数据写入一个字符串,如34,23,12然后返回它,以便另一个类可以使用它。但是,如果我把它(字符串代码,你会在下面看到它)在if (fragmentReader.Read())代码下它不起作用,因为它只是与它上面的console.writeline做同样的事情:读取其中一个片段然后写入控制台,然后是下一个片段,它不会将片段中的所有值都添加到一个字符串中。

感谢

private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues"))
        {
            using (var readerz = file.CreateViewAccessor(0, 0))
            {
                var bytes = new byte[195];
                var encoding = Encoding.ASCII;
                readerz.ReadArray<byte>(0, bytes, 0, bytes.Length);

                //File.WriteAllText("C:\\myFile.txt", encoding.GetString(bytes));

                StringReader stringz = new StringReader(encoding.GetString(bytes));

                var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };
                using (var reader = XmlReader.Create(stringz, readerSettings))
                {
                    while (reader.Read())
                    {
                        using (var fragmentReader = reader.ReadSubtree())
                        {
                            if (fragmentReader.Read())
                            {
                                reader.ReadToFollowing("value");
                                //Console.WriteLine(reader.ReadElementContentAsString() + ",");

                                System.Text.StringBuilder sb = new System.Text.StringBuilder();
                                sb.Append(reader.ReadElementContentAsString()).Append(",");
                                Console.WriteLine(sb.ToString());
                            }
                        }
                    }
                }                
            }
        }
    }

3 个答案:

答案 0 :(得分:5)

问题是在循环的每次迭代中,您都在创建一个新的stringbuilder对象。您需要在循环之前创建该对象,然后在循环之后打印该字符串。

你想要什么:

                 System.Text.StringBuilder sb = new System.Text.StringBuilder();
                 while (reader.Read())
                    {
                        using (var fragmentReader = reader.ReadSubtree())
                        {
                            if (fragmentReader.Read())
                            {
                                reader.ReadToFollowing("value");
                                //Console.WriteLine(reader.ReadElementContentAsString() + ",");


                                sb.Append(reader.ReadElementContentAsString()).Append(",");
                            }
                        }
                    }
                    Console.WriteLine(sb.ToString());

答案 1 :(得分:1)

您的StringBuilder sb 似乎超出了范围。尝试移动它,以便在您输入例程后立即创建它。并且要添加@Stephan H声明在退出循环后需要放置WriteLine,以便获得正确的输出。

static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues")) 
    { ....

答案 2 :(得分:1)

尝试在while循环之外移动StringBuilderWriteLine调用。由于您在循环的每次迭代中都进行了新的StringBuilder,因此您只得到一个只有1个值的字符串(您刚读过的值)。

using (var reader = XmlReader.Create(stringz, readerSettings))
{
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    while (reader.Read())
    {
        using (var fragmentReader = reader.ReadSubtree())
        {
            if (fragmentReader.Read())
            {
                reader.ReadToFollowing("value");
                sb.Append(reader.ReadElementContentAsString()).Append(",");
            }
        }
    }
    Console.WriteLine(sb.ToString());
}