处于Epilog状态的令牌StartElement将导致无效的XML文档



我得到错误"处于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());

这个错误的原因是什么?如何修复?

这里有一些问题:

  1. 您正在向文档中写入多个根元素,每个根元素对应于对xmlTextWriter.WriteStartElement("")的调用。但是,一个格式良好的XML文档必须有一个并且只有一个根元素,因此您需要将行元素封装在某个容器元素中。

    (您可能认为WriteStartDocument()会编写根元素,但事实并非如此。它只是编写XML声明。(

  2. 您正在使用XmlTextWriter,但该类已被弃用。来自文档:

    从.NET Framework 2.0开始,我们建议您使用XmlWriter.create方法和XmlWriterSettings类创建XmlWriter实例,以利用新功能。

    如果切换到XmlWriter,您将获得更清晰的错误消息和更好的错误检查。

  3. 您正在尝试使用无名称编写元素:

    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();

在这里演示小提琴。

最新更新