Xml Writer:InvalidOperationException

时间:2016-04-27 18:51:23

标签: c# xml

我有完全相同的例程将数据写入Xml文件没有任何问题。在这里,我试图编写一个类实例数据,在第一行我得到这个错误:

  

抛出异常:System.Xml.dll中的“System.InvalidOperationException”

Documentation中,它表示writer已关闭。我怎么能“打开”呢?

// stuff
XmlWriter writer = XmlWriter.Create(path + "\\" + this.Name);
writer.WriteStartDocument();

writer.WriteAttributeString("ID", this.Id.ToString()); // error pops here
writer.WriteAttributeString("Description", this.Description);
// other stuff

1 个答案:

答案 0 :(得分:3)

您尝试编写属性,但尚未编写元素。 所以你基本上需要做的是:在写一个属性之前创建一个元素:

writer.WriteStartElement("book");
writer.WriteAttributeString("ID", this.Id.ToString()); // ID becomes an attribute of "book"

文档说的是,当InvalidOperationException被提出时,作者将被关闭。默认情况下它是开放的。

修改

再看看docs: - )

  

当您使用XmlWriter方法输出XML时,元素和   在您调用Close方法之前,属性不会写为。对于   例如,如果您使用XmlWriter填充XmlDocument,   直到你关闭XmlWriter,你将无法观察到   目标文件中的书面元素和属性。

因此,如果您希望将内容写入文件,则必须刷新或关闭编写器。您可以通过显式调用(writer.Close())或 - 可能更好一点 - 使用using - 语句来执行此操作,该语句为您处理和关闭编写器:

using(var writer = XmlWriter.Create(path + "\\" + this.Name))
{
    writer.WriteStartDocument();
    writer.WriteStartElement("book");
    writer.WriteAttributeString("ID", this.Id.ToString());
    // even more elements etc.

} // .Close() is called implicitly for you

<强> EDIT2:

生成的XML写入一行,因为写空白只会浪费资源。 XML可以有效地写入一行。 但是,如果您希望XML能够很好地缩进并且是人类可读的,那么您必须通过XmlWriterSettings指定:

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;

using(var writer = XmlWriter.Create(path + "\\" + this.Name, settings))
{
    // other code...