使用XmlDocument创建保存XML文件,使用txt或记事本打开后XML格式问题

时间:2021-12-21 10:03:43

创建XML文件并保存,原程序:

XmlDocument doc = new XmlDocument();
Doc = …;
string s = doc.OuterXml;
byte[] MyData = new byte[0];
SaveFileDialog savetxtdialog = new SaveFileDialog();
savetxtdialog.Filter = "XML文件(*.xml)|*.xml";
savetxtdialog.RestoreDirectory = true;
savetxtdialog.FileName = @"C:\" + zdh + ".xml";
DialogResult dialogResult = savetxtdialog.ShowDialog(this);
if (dialogResult == DialogResult.OK)
{
                MyData = System.Text.Encoding.Default.GetBytes(s);

                string filePath = savetxtdialog.FileName;
                FileStream dgnfs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
                dgnfs.Write(MyData, 0, MyData.Length);

                //清空缓冲区、关闭流
                dgnfs.Flush();
              dgnfs.Close();
}

这样写出XML文件没问题,只不过用普通txt文件打开方式打开的话,是从头到尾连成一行的。。

其实有一些文本编辑器打开XML文件会自动识别和自动排版为XML格式,用IE方式打开也是。但客户要求txt打开就要排版有换行有缩进,所以要改。

开始尝试思路是遍历XmlDocument 中所有节点并换行,类似于StringBuilder中的AppendLine().

边查资料边修改调试整了半天大概找到了一个解决方法如下,换行上还是有点BUG,某情况下会多换一行..

使用XmlDocument创建保存XML文件,使用txt或记事本打开后XML格式问题使用XmlDocument创建保存XML文件,使用txt或记事本打开后XML格式问题View Code
 1            XmlNodeList nodeList = doc.ChildNodes;
2 for (int i = 0; i < nodeList.Count; i++)
3 {
4 XmlNode node = nodeList[i];
5
6 InsertXMLEnter(node);
7 }
8
9 private void InsertXMLEnter(XmlNode xmlNode)
10 {
11 if (xmlNode.InnerText != "\r\n")
12 {
13 if (!xmlNode.HasChildNodes)
14 {
15 if (xmlNode.PreviousSibling == null)
16 {
17 XmlSignificantWhitespace LspacePA = xmlNode.OwnerDocument.CreateSignificantWhitespace("\r\n");
18 xmlNode.ParentNode.InsertAfter(LspacePA, xmlNode);
19 }
20 }
21 else
22 {
23 foreach (XmlNode node in xmlNode.ChildNodes)
24 {
25 if (node.InnerText != "\r\n")
26 {
27 XmlSignificantWhitespace LspaceFB = xmlNode.OwnerDocument.CreateSignificantWhitespace("\r\n");
28 xmlNode.InsertBefore(LspaceFB, node);
29 XmlSignificantWhitespace LspaceFA = xmlNode.OwnerDocument.CreateSignificantWhitespace("\r\n");
30 xmlNode.InsertAfter(LspaceFA, node);
31
32 InsertXMLEnter(node);
33 }
34 }
35 }
36 }
37 }

基本原理就是找节点并插入换行节点.但这样是费力不讨好,还没缩进..不行,改变思路最后发现换条路海阔天空,简单解决~

使用XmlDocument创建保存XML文件,使用txt或记事本打开后XML格式问题使用XmlDocument创建保存XML文件,使用txt或记事本打开后XML格式问题View Code
 1 if (dialogResult == DialogResult.OK)
2 {
3 XmlWriterSettings settings = new XmlWriterSettings();
4 settings.Indent = true;
5 settings.Encoding = new UTF8Encoding(false);
6 settings.NewLineChars = Environment.NewLine;
7
8 XmlWriter xw = XmlWriter.Create(filePath,settings);
9
10 doc.Save(xw);
11 xw.Close();
12 }

这样出来用什么打开方式都显示标准的XML格式了。