使用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/>  

 

posted on 2016-06-06 14:41  ace_wuqing  阅读(3002)  评论(0编辑  收藏  举报