【问题标题】:Streamwriter.Writeline and File.WriteAllText writing text out of orderStreamwriter.Writeline 和 File.WriteAllText 乱序写入文本
【发布时间】:2013-01-29 20:56:37
【问题描述】:

我遇到了一个问题,我将多个 xml 文件的内容写入一个文件。当我运行程序时,输出格式正确,但单词乱序。一个例子:

我的字符串是"<s:AttributeType name=\"Shift\" number=\"34\" nullable=\"true\" writeunknown=\"true\">"

所以它应该打印<s:AttributeType name="Shift" number="34" nullable="true" writeunknown="true">

而是<s:AttributeType name="Shift" writeunknown="true" number="34" nullable="true">

返回。

部分文件是使用File.WriteAllText(@"C:\Users\status.xml", xsh);写入的 其中 'xsh' 是一个包含字符串的变量。

其余的都是用这个循环写的:

 foreach (var i in Numbers.GetWSnumber())
        {
            string contents = "";
            string curFile = @"\\production\public\Staus\TStatus\WS" + i.SetId + ".xml";
            if (File.Exists(curFile))
            {
                System.IO.StreamReader file = new System.IO.StreamReader(curFile);
                while ((contents = file.ReadLine()) != null)
                {
                    using (StreamWriter sw = File.AppendText(@"C:\Users\status.xml"))
                    {
                        sw.WriteLine(contents);
                    }   


                }
                file.Close();
            }
        }

感谢任何帮助

【问题讨论】:

  • 在语义上,重新排序 xml 属性时没有区别。为什么会出现这个问题?
  • 您知道实际输出和预期输出在语义上是相同的,因为属性的顺序在 Xml 中是不相关的,对吧?
  • 在我看来,在某些时候会涉及到 XML 解析器。
  • @spender 没错,但这根本不能回答他的问题——我认为这是为了找出发生这种情况的原因。如果它以相同的无序顺序写入属性,那么它可能没问题,但如果它每次都不同,则会影响他输出到的任何内容的可读性。
  • 当前示例代码不太可能重新排序 XML 属性。它可能导致创建无效的 XML 作为结果(即,如果碰巧将 XML 与不同的编码合并或忘记打开/关闭标签)。正如@Cyborgx37 指出的那样,该行为最可能的原因是发生了 XML 解析/生成,并且属性按设计任意排序,而不是合并文件。

标签: c# xml filestream


【解决方案1】:

XML 属性的顺序并不重要,所以我不会担心。但是,如果它真的让您烦恼,我建议您移动您的 using 语句。

using (StreamWriter sw = File.AppendText(@"C:\Users\status.xml"))
{
    sw.WriteLine(contents);
}

虽然这可能已经过优化,因此它的工作方式与编写得更好时一样,但您目前拥有这个的方式是分配一个新的StreamWriter,然后在每次迭代时处理掉。

您的 using 语句应该包装 while 循环,而不是相反。这可能会解决问题(尽管我认为不太可能),因为我不知道编译器是如何处理这一行的。无论哪种方式,都值得改变。

【讨论】:

  • 我不认为改变 using 块的位置会产生任何影响,尽管你是对的,这样做会更有效率。
  • @Cyborgx37 是的,我认为它也不会,但是如果您不使用 XML 读取器/写入器,我不知道字符串会如何更改。答案更多的是改进代码的一般性建议,而不是针对特定问题的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 2021-01-02
相关资源
最近更新 更多