我有完全相同的例程将数据写入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
答案 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...