【问题标题】:Serialize class to XML results in "invalid XML document" error将类序列化为 XML 导致“无效的 XML 文档”错误
【发布时间】:2013-07-03 19:52:41
【问题描述】:

我有以下类的对象:

public class Root
{
    [XmlElement]
    public BOMItems[] Row { get; set; }
}
public class BOMItems
{
    [XmlElement("ITEMNO")]
    public string ITEMNO { get; set; }
    [XmlElement("USED")]
    public string USED { get; set; }
    [XmlElement("PARTSOURCE")]
    public string PARTSOURCE { get; set; }
    [XmlElement("QTY")]
    public string QTY { get; set; }
}

我正在尝试使用此方法将其序列化为XDocument

public XDocument TransformClassToXMLBOM(Root rt)
{
    var serializer = new XmlSerializer(typeof(Root));
    var sww = new StringWriter();
    var settings = new XmlWriterSettings();
    settings.ConformanceLevel = ConformanceLevel.Auto;
    var writer = XmlWriter.Create(sww, settings);

    serializer.Serialize(writer, rt);

    var doc = new XDocument( 
                    new XElement("Row",
                        new XElement("ITEMNO"),
                        new XElement("USED"),
                        new XElement("PARTSOURCE"),
                        new XElement("QTY")));                                           
    doc.Save(writer);
    return doc;
}

我什至尝试在new XElement("Row", 之前插入一个额外的元素,如下所示:

var doc = new XDocument( 
               new XElement("Root",
                    new XElement("Row",...

我总是在doc.Save(writer);这一行收到以下错误:

处于 EndRootElement 状态的令牌 StartDocument 将导致 无效的 XML 文档。确保 ConformanceLevel 设置为 如果需要,设置为 ConformanceLevel.Fragment 或 ConformanceLevel.Auto 编写一个 XML 片段。

起初我以为我可能缺少 XElement 或拼写错误,但我找不到任何错误。我不知道如何查看writer 中的值来检查结果,所以我不知道如何找到解决方案。

我想以这样的方式结束:

<Root>
  <Row>
    <ITEMNO>1</ITEMNO>
    <USED>Y</USED>
    <PARTSOURCE>BUY</PARTSOURCE>
    <QTY>10</QTY>
  </Row>
</Root>

如何找到问题的原因?实现我想要的结果的正确方法是什么?

【问题讨论】:

  • 你想达到什么目的?你能清楚地说明你的输出吗?
  • 我希望将 Root 对象转换为 XML 字符串
  • 看我下面的答案..这是你想要的吗?

标签: c# xml-serialization


【解决方案1】:

查看 Xml 可序列化通用字典 http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx 您可以为您的案例做几乎相同的事情。

更新 然后你可以像这样使用标准序列化来序列化你的类

    public static string SerializeObjectToXml<T>(T obj)
    {
        MemoryStream memoryStream = new MemoryStream();
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);

        xmlSerializer.Serialize(xmlTextWriter, obj);
        memoryStream = (MemoryStream)xmlTextWriter.BaseStream;

        string xmlString = ByteArrayToStringUtf8(memoryStream.ToArray());

        xmlTextWriter.Close();
        memoryStream.Close();
        memoryStream.Dispose();

        return xmlString;
    }

更新2

    public static string ByteArrayToStringUtf8(byte[] value)
    {
        UTF8Encoding encoding = new UTF8Encoding();
        return encoding.GetString(value);
    }

更新3

更清晰的方式:

[Serializable]
public class Root
{
    [XmlElement("ITEMS")]
    public BOMItem[] Row { get; set; }
}

[Serializable]
public class BOMItem
{
    [XmlElement("ITEMNO")]
    public string ITEMNO { get; set; }
    [XmlElement("USED")]
    public string USED { get; set; }
    [XmlElement("PARTSOURCE")]
    public string PARTSOURCE { get; set; }
    [XmlElement("QTY")]
    public string QTY { get; set; }
}

所以你可以像这样得到你的xml:

        Root r1 = new Root();
        r1.Row = new BOMItem[2];
        r1.Row[0] = new BOMItem {ITEMNO = "1", PARTSOURCE = "11", QTY = "111", USED = "1111"};
        r1.Row[1] = new BOMItem { ITEMNO = "2", PARTSOURCE = "22", QTY = "222", USED = "2222" };
        MessageBox.Show(String.Format("Serialization result: {0}", SerializeObjectToXml(r1)));

【讨论】:

  • 这有什么帮助?我看不到它如何演示如何序列化自定义类。
  • 在你的课堂上实现 ISerializable 接口,你会没事的
  • 你在哪里得到/定义ByteArrayToStringUtf8
  • 如果您不打算使用非同寻常的东西,Update 3 看起来会更好。
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2017-01-27
  • 2019-04-12
  • 2013-02-19
  • 1970-01-01
  • 2017-07-05
相关资源
最近更新 更多