Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中XMLwriter的缩进和新行命令#_C#_Xml_Xmlwriter - Fatal编程技术网

C# C中XMLwriter的缩进和新行命令#

C# C中XMLwriter的缩进和新行命令#,c#,xml,xmlwriter,C#,Xml,Xmlwriter,我正在将一些数据写入XML文件…但当我打开它时,所有的值都在一行中…如何以可读的格式写入它?即每一个节点都在新行和缩进中 FileStream fs = new FileStream("myfile.xml", FileMode.Create); XmlWriter w = XmlWriter.Create(fs); w.WriteStartDocument(); w.WriteStartElement("myfile"); w.WriteElementS

我正在将一些数据写入XML文件…但当我打开它时,所有的值都在一行中…如何以可读的格式写入它?即每一个节点都在新行和缩进中

FileStream fs = new FileStream("myfile.xml", FileMode.Create);

XmlWriter w = XmlWriter.Create(fs);

w.WriteStartDocument();
w.WriteStartElement("myfile");                 

w.WriteElementString("id", id.Text);
w.WriteElementString("date", dateTimePicker1.Text);
w.WriteElementString("version", ver.Text);
w.WriteEndElement();
w.WriteEndDocument();
w.Flush();
fs.Close();

检查设置属性:

w.Settings.Indent = true;
编辑:不能直接设置:

System.Xml.XmlWriter.Create("path", new System.Xml.XmlWriterSettings())

设置XmlTextWriter的格式化属性:

TextWriter textWriter;
var xmlTextWriter = new XmlTextWriter(textWriter);
xmlTextWriter.Formatting = Formatting.Indented;

使用
XmlTextWriter
而不是
XmlWriter
,然后设置
缩进
属性

示例

string filename = "MyFile.xml";

using (FileStream fileStream = new FileStream(filename, FileMode.Create))
using (StreamWriter sw = new StreamWriter(fileStream))
using (XmlTextWriter xmlWriter = new XmlTextWriter(sw))
{
  xmlWriter.Formatting = Formatting.Indented;
  xmlWriter.Indentation = 4;

  // ... Write elements
}
在@jumbo comment之后,这也可以像.NET2一样实现

var filename = "MyFile.xml";
var settings = new XmlWriterSettings() 
{
    Indent = true,
    IndentChars = "    "
}

using (var w = XmlWriter.Create(filename, settings))
{
    // ... Write elements
}

首先需要创建一个指定缩进的XmlWriterSettings对象,然后在创建XmlWriter时,在路径后传入XmlWriterSettings

此外,我使用
using
块让C#处理我的资源处置,这样我就不必担心在异常时丢失任何资源

{
  XmlWriterSettings xmlWriterSettings = new XmlWriterSettings()
  {
    Indent = true,
    IndentChars = "\t",
    NewLineOnAttributes = true
  };

  using (XmlWriter w= XmlWriter.Create("myfile.xml", xmlWriterSettings))
  {
    w.WriteStartDocument();
    w.WriteStartElement("myfile");

    w.WriteElementString("id", id.Text);
    w.WriteElementString("date", dateTimePicker1.Text);
    w.WriteElementString("version", ver.Text);
    w.WriteEndElement();
    w.WriteEndDocument();
  }
}

使用如下设置:

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

        using (MemoryStream memoryStream = new MemoryStream())
        using (XmlWriter xmlDoc = XmlWriter.Create(memoryStream, settings)){
         // logic here..
        }

这将使您达到您想要的目的,但是,您不必使用MemoryStream,重要的部分是设置。

使用XmlWriter plus XmlWriterSettings direct to file的小VB.NET版本:

Dim oSerializer As New XmlSerializer(GetType(MyType), New XmlRootAttribute("MyRootAttributeName"))
Using oXmlWriter As XmlWriter = XmlWriter.Create("MyFilePath", New XmlWriterSettings With {.Indent = True}) //Default encoding is utf-8
    oSerializer.Serialize(oXmlWriter, oInstanceOfMyType)
    oXmlWriter.Flush()
End Using

检查文档中的其他设置和文件覆盖选项,但这是干净的,在许多情况下都能正常工作。

例外情况:“XmlWriterSettings.Indent”属性是只读的,无法设置。我的错误是,您需要使用“Create”方法并直接传递它;更新了答案。但如果需要,则无法设置XmlSettings属性使用XmlTextWriter(自.Net2.0)。有关更多信息,请参阅。从技术上讲,将“
Indent
”设置为true就是让
Xml(Text?)编写器发出新行所需的全部内容。此“
格式化
”属性在.NET(或汇编?)的哪个版本中?我的解决方案以4.5.1为目标,不知道
Xml(Text?)Writer
上的任何“
Formatting
”属性。自.net 2.0以来,XmlTextWriter一直被弃用