创建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,某情况下会多换一行..
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 }
基本原理就是找节点并插入换行节点.但这样是费力不讨好,还没缩进..不行,改变思路最后发现换条路海阔天空,简单解决~
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格式了。