C# 将类序列化为XML结果为;无效的XML文档";错误
我有一个以下类别的对象:C# 将类序列化为XML结果为;无效的XML文档";错误,c#,xml-serialization,C#,Xml Serialization,我有一个以下类别的对象: 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; } [X
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;
}
我甚至尝试过在新XElement(“行”)之前插入一个额外的元素,如下所示:
var doc = new XDocument(
new XElement("Root",
new XElement("Row",...
<Root>
<Row>
<ITEMNO>1</ITEMNO>
<USED>Y</USED>
<PARTSOURCE>BUY</PARTSOURCE>
<QTY>10</QTY>
</Row>
</Root>
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)));
我总是在这一行doc.Save(writer);
上看到下面的错误:
状态EndRootElement中的令牌StartDocument将导致
无效的XML文档。请确保ConformanceLevel设置为
设置为ConformanceLevel.Fragment或ConformanceLevel.Auto(如果需要)
编写一个XML片段
起初我认为我可能缺少一个元素或拼写错误,但我找不到任何错误。我不知道如何查看writer
中的值来检查结果,因此我不知道如何找到解决方案
我想以这样的话结束:
var doc = new XDocument(
new XElement("Root",
new XElement("Row",...
<Root>
<Row>
<ITEMNO>1</ITEMNO>
<USED>Y</USED>
<PARTSOURCE>BUY</PARTSOURCE>
<QTY>10</QTY>
</Row>
</Root>
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)));
1.
Y
购买
10
如何找到问题的原因?实现所需结果的正确方法是什么?请查看Xml序列化通用词典 你可以为你的案子做几乎相同的事情 Upd 然后您可以像这样使用标准序列化来序列化您的类
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;
}
upd3
更清晰的方式:
[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:
var doc = new XDocument(
new XElement("Root",
new XElement("Row",...
<Root>
<Row>
<ITEMNO>1</ITEMNO>
<USED>Y</USED>
<PARTSOURCE>BUY</PARTSOURCE>
<QTY>10</QTY>
</Row>
</Root>
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)));
你想实现什么?你能清楚地说明你的输出吗?我想把根对象转换成XML字符串看看下面的答案..这就是你想要的吗?这有什么帮助吗?我不知道它如何演示如何序列化自定义类。在类中实现ISerializable接口,你会很好。你从哪里获得/定义
ByteArrayToStringUtf8
?如果你不打算使用一些特别的东西,更新3看起来会更好。