【问题标题】:Converting xml to string and back again produces 'root element error'将 xml 转换为字符串并再次返回会产生“根元素错误”
【发布时间】:2017-08-10 06:34:47
【问题描述】:

我正在将“不寻常”的 xml 转换为字符串。我说不寻常,因为我使用 .NET ChartSerializer 来保存 winforms 图表状态:

var xml = new XmlDocument();
using (MemoryStream ms = new MemoryStream())
{
    chart1.Serializer.Save(ms);
    xml.Load(ms);
}

如果我使用

转换为字符串
using (StringWriter sw = new StringWriter())
{
     using (XmlTextWriter txt = new XmlTextWriter(sw))
     {
         xml.WriteTo(txt);
         string str = sw.ToString();
         fuse.c1 = str;
     }
}

并将其保存到文件中(我尝试过 JSON、txt、xml),然后使用转换回来

var xml = new XmlDocument();
xml.LoadXml(fuse.c1);
using (MemoryStream ms = new MemoryStream())
{
    xml.Save(ms);
    chart1.Serializer.Load(ms);
}

我收到一个错误root element is missing

我不明白这个错误,因为我只是使用相同的类等转换为字符串并再次返回。

我对xml不是很熟悉,谁能发现我的失误?我正在尝试为每个图表保存多个没有 .xml 文件的 winforms 图表

示例 xml:

<Chart Size="854, 215">
  <Series>
    <Series Name="Series1" Legend="Legend1" ChartArea="ChartArea1" Color="Orange" LegendText="% Change">
      <Points>
        <DataPoint YValues="10.3973534917773" />
        <DataPoint XValue="0.2" YValues="8.37818721941151" />
        <DataPoint XValue="0.4" YValues="5.57375277883594" />
**snip many more data points**
     </Points>
    </Series>
  </Series>      
  <ChartAreas>
    <ChartArea Name="ChartArea1">
    </ChartArea>
  </ChartAreas>
</Chart>

【问题讨论】:

  • “我正在尝试保存多个 winforms 图表,但每个图表都没有 .xml 文件” 它适用于单个图表吗?您是否已经查看了生成的文件?
  • 可以把创建的xml文件的样本发过来吗?
  • 如果我只使用 serializer.Save() 然后我得到一个 .xml 文件,我确实可以将它加载回图表控件(即 .xml 文件,不是字符串,然后返回)。如果我可以让它与一个一起工作,我将为所有图表制作一个字符串 []。
  • xml.Save(ms)chart1.Serializer.Load(ms) 调用之间尝试ms.Position = 0。流操作通常会在末尾留下流“光标”。
  • 改用 XElement.Load 看看是否有帮助。您在提供的示例中缺少 xml 元素,普通 xml 以 xml 元素作为第一个元素开始。

标签: c# xml


【解决方案1】:

您在 cmets 中有特定问题的答案 - 您需要倒带。

但值得注意的是,似乎有overloads 接受TextWriterTextReader,所以你可以用更少的仪式来做你正在做的事情。

要保存,您可以使用StringWriter

using (var writer = new StringWriter())
{
    chart1.Serializer.Save(writer);
    fuse.c1 = writer.ToString();
}

要再次加载它,您可以使用StringReader

using (var reader = new StringReader(fuse.c1))
{
    chart1.Serializer.Load(reader);
}

【讨论】:

  • 感谢您,我现在有一个新工具,并且代码更简单。效果很好
猜你喜欢
  • 2015-01-19
  • 2013-02-18
  • 2011-01-13
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 2011-11-15
相关资源
最近更新 更多