我得到错误"处于Epilog状态的令牌StartElement将导致无效的XML文档"当我从datatable中获取数据并尝试将其转换为xml文件时。
代码:
DataTable dtTest = new DataTable();
dtTest.Columns.Add("Name");
dtTest.Columns.Add("NickName");
dtTest.Columns.Add("Code");
dtTest.Columns.Add("reference");
dtTest.Rows.Add("Yash", "POPs", "Vapi", "None1");
dtTest.Rows.Add("shilpa", "shilpa", "valsad", "None2");
dtTest.Rows.Add("Dinesh", "dinu", "pune", "None3");
dtTest.Rows.Add("rahul", "mady", "pardi", "None4");
XmlWriterSettings settings = new XmlWriterSettings();
StringWriter stringwriter = new StringWriter();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stringwriter);
xmlTextWriter.Formatting = Formatting.Indented;
xmlTextWriter.WriteStartDocument();
foreach (var row in dtTest.AsEnumerable())
{
xmlTextWriter.WriteStartElement("");
xmlTextWriter.WriteAttributeString("orderid", row.Field<string>("Name"));
xmlTextWriter.WriteElementString("type", row.Field<string>("Name"));
xmlTextWriter.WriteElementString("status", row.Field<string>("Name"));
xmlTextWriter.WriteElementString("productno", row.Field<string>("Name"));
xmlTextWriter.WriteEndElement();
}
XmlDocument docSave = new XmlDocument();
docSave.LoadXml(stringwriter.ToString());
这个错误的原因是什么?如何修复?
这里有一些问题:
-
您正在向文档中写入多个根元素,每个根元素对应于对
xmlTextWriter.WriteStartElement("")
的调用。但是,一个格式良好的XML文档必须有一个并且只有一个根元素,因此您需要将行元素封装在某个容器元素中。(您可能认为
WriteStartDocument()
会编写根元素,但事实并非如此。它只是编写XML声明。( -
您正在使用
XmlTextWriter
,但该类已被弃用。来自文档:从.NET Framework 2.0开始,我们建议您使用XmlWriter.create方法和XmlWriterSettings类创建XmlWriter实例,以利用新功能。
如果切换到
XmlWriter
,您将获得更清晰的错误消息和更好的错误检查。 -
您正在尝试使用无名称编写元素:
xmlTextWriter.WriteStartElement("");
这将导致XML格式错误。
XmlTextWriter
似乎没有对此进行检查,但XmlWriter
进行了检查。
将以上所有内容放在一起,您的代码可以修改如下:
var stringwriter = new StringWriter();
using (var xmlWriter = XmlWriter.Create(stringwriter, new XmlWriterSettings { Indent = true }))
{
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("Root");
foreach (var row in dtTest.AsEnumerable())
{
xmlWriter.WriteStartElement("Row");
xmlWriter.WriteAttributeString("orderid", row.Field<string>("Name"));
xmlWriter.WriteElementString("type", row.Field<string>("Name"));
xmlWriter.WriteElementString("status", row.Field<string>("Name"));
xmlWriter.WriteElementString("productno", row.Field<string>("Name"));
xmlWriter.WriteEndElement();
}
xmlWriter.WriteEndElement();
}
var xml = stringwriter.ToString();
在这里演示小提琴。