C# 生成XML空元素/空节点自动换行解决方案

题外话:

使用DataSet可以直接输出XML,并可指定是否带有Schema:

ds.WriteXml(XMLFile,XmlWriteMode.WriteSchema  )
不过,这样将不会输出值为Null的字段,如:

你可能希望结果是这样:

<a>1</a>
<b>2</b>
<c></c>

但结果为:

<a>1</a>
<b>2</b>

c没有输出在XML文件中,其实我觉得这样更合理,否则,如何区分null和""呢?如果希望输出c,那只能通过XmlDocument自己写了:

            //初始化一个xml实例
            XmlDocument XmlDoc = new XmlDocument();
            XmlNode xmlnode = XmlDoc.CreateNode(XmlNodeType.XmlDeclaration, "", "");
            XmlDoc.AppendChild(xmlnode);
            //创建xml的根节点
            XmlElement rootElement = XmlDoc.CreateElement("Rows");
            //将根节点加入到xml文件中(AppendChild)
            XmlDoc.AppendChild(rootElement);

            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                XmlElement xmlRow = XmlDoc.CreateElement("Row");
                rootElement.AppendChild(xmlRow);
                foreach (DataColumn col in ds.Tables[0].Columns)
                {
                    XmlElement xmlCol = XmlDoc.CreateElement(col.ColumnName);
                    xmlCol.InnerText = dr[col].ToString();
                    xmlRow.AppendChild(xmlCol);
                }
            }

            XmlDoc.Save(file);

空节点显示出来了,但是,另一个问题出现了,空节点换行了,成了这样:

<a>1</a>
<b>2</b>
<c>
</c>

虽然这样也符合XML标准,使用C#也很容易可以读取该XML,但是对于一些有审美洁癖的人和已经写好的XML导入程序来说,总希望能改进一下,将空元素放到一行里边去。有人说使用XmlTextWriter 的Formatting,即:

            using (XmlTextWriter xtw = new XmlTextWriter(file, null))
            {
                xtw.Formatting = Formatting.None;
                XmlDoc.Save(xtw);
            }

但是这样一来,XML里所有内容都不换行全连在一起了,可读性更差。实际上值为NULL或者""时,不要给InnerText赋值就行了:

                    if (dr[col].ToString() != null && dr[col].ToString() != "")
                    {
                        xmlCol.InnerText = dr[col].ToString();
                    }

输出:

<a>1</a>
<b>2</b>
<c/>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章