C#操作XML学习之创建XML文件的同时新建根节点和子节点(多级子节点)

最近工作中遇到一个问题,要求创建一个XML文件,在创建的时候要初始化该XML文档,同时该文档打开后是XML形式,但是后缀名不是。在网上找了好些资料没找到,只能自己试着弄了一下,没想到成功了,把它记下来作为自己的学习笔记。

需求:创建XML文件,后缀名为.xwsp

初始化的文档节点如下:

 <?xml version="1.0" encoding="UTF-8"?>
<xxxversion="1.0" name="aaa">
<CreationInfo>
<CreatedBy>CreateUser</CreatedBy>
<CreatedTime>2015/10/1 14:03:48</CreatedTime>
<SavedTime>2015/10/1 14:03:48</SavedTime>
</CreationInfo>
<a/>
<b/>
<c/>
</xxx>

首先第一个问题:后缀名为.xwsp,打开后显示的XML文本

当时这个问题想复杂了,因为要进行二进制转换之类的,网上找了老半天没找到,最后自己试了一下,简单的要死,只能说自己笨

解决方法:xmlDoc.Save("a.xwsp");

只要保存xml文件的时候改了后缀名即可,我也是醉了

第二个问题:添加节点的时候尤其是添加<CreatedBy><CreatedTime><SavedTime>这三个节点的时候老是添加不进去

当时写的代码如下:

 private static void CreateXwspFile(string fileName, string path)
{
XmlDocument xmlDoc = new XmlDocument();
//创建类型声明节点
XmlDeclaration xdDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
xmlDoc.AppendChild(xdDec); //创建根节点
XmlElement xeRoot = xmlDoc.CreateElement("xxx");
//给节点属性赋值
xeRoot.SetAttribute("version", "1.0");
xeRoot.SetAttribute("name", fileName);
xmlDoc.AppendChild(xeRoot); //创建并添加<CreationInfo></CreationInfo>节点
xeRoot = xmlDoc.CreateElement("CreationInfo");
XmlNode xnXwsp = xmlDoc.SelectSingleNode("xxx");
if (xnXwsp != null)
{
xnXwsp.AppendChild(xeRoot);
} //创建并添加<CreatedBy></CreatedBy>节点
xeRoot = xmlDoc.CreateElement("CreatedBy");
xnXwsp = xmlDoc.SelectSingleNode("CreationInfo");
if (xnXwsp != null)
{
xnXwsp.AppendChild(xeRoot);
} //创建并添加<CreatedTime></CreatedTime>节点
xeRoot = xmlDoc.CreateElement("CreatedTime");
xnXwsp = xmlDoc.SelectSingleNode("CreationInfo");
if (xnXwsp != null)
{
xnXwsp.AppendChild(xeRoot);
} //创建并添加<SavedTime></SavedTime>节点
xeRoot = xmlDoc.CreateElement("SavedTime");
xnXwsp = xmlDoc.SelectSingleNode("CreationInfo");
if (xnXwsp != null)
{
xnXwsp.AppendChild(xeRoot);
} //创建并添加<a></a>节点
xeRoot = xmlDoc.CreateElement("a");
xnXwsp = xmlDoc.SelectSingleNode("xxx");
if (xnXwsp != null)
{
xnXwsp.AppendChild(xeRoot);
}
//创建并添加<b></b>节点
xeRoot = xmlDoc.CreateElement("b");
xnXwsp = xmlDoc.SelectSingleNode("xxx");
if (xnXwsp != null)
{
xnXwsp.AppendChild(xeRoot);
}
//创建并添加<c></c>节点
xeRoot = xmlDoc.CreateElement("c");
xnXwsp = xmlDoc.SelectSingleNode("xxx");
if (xnXwsp != null)
{
xnXwsp.AppendChild(xeRoot);
}
//保存XML文档
try
{
xmlDoc.Save(path + fileName + ".xwsp");
}
catch (Exception ep)
{
Console.WriteLine(ep.Message);
}
}

结果如下:

 <?xml version="1.0" encoding="utf-8"?>
<xxx version="1.0" name="workspace1">
<CreationInfo />
<a />
<b />
<c />
</xxx>

子节点<CreatedBy><CreatedTime><SavedTime>死活出不来,打断点<CreationInfo>节点先添加进去了,但是xnXwsp = xmlDoc.SelectSingleNode("CreationInfo");这一句的结果死活为null,想不通,现在都没想通,后来换了一种写法就OK了

这种得不到正确写法的思路是:先添加父节点<CreationInfo>再添加子节点<CreatedBy><CreatedTime><SavedTime>

网上找到另一种写法,思路是:先创建子节点<CreatedBy><CreatedTime><SavedTime>,再创建父节点<CreationInfo>,然后把子节点添加到该父节点下面,再查找根节点<xxx>,最后把父节点<CreationInfo>添加到根节点末尾就OK了,代码如下:

 private static void CreateXwspFile(string fileName, string path)
{
XmlDocument xmlDoc = new XmlDocument();
//创建类型声明节点
XmlDeclaration xdDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
xmlDoc.AppendChild(xdDec); //创建根节点
XmlElement xeRoot = xmlDoc.CreateElement("xxx");
//给节点属性赋值
xeRoot.SetAttribute("version", "1.0");
xeRoot.SetAttribute("name", fileName);
xmlDoc.AppendChild(xeRoot); ////创建并添加<CreationInfo></CreationInfo>节点
////创建并添加<CreatedBy></CreatedBy>节点
////创建并添加<CreatedTime></CreatedTime>节点
////创建并添加<SavedTime></SavedTime>节点
XmlElement xeCreationInfo = xmlDoc.CreateElement("CreationInfo");
XmlElement xeCreatedBy = xmlDoc.CreateElement("CreatedBy");
xeCreatedBy.InnerText = "Tektronix Course Editor";
XmlElement xeCreatedTime = xmlDoc.CreateElement("CreatedTime");
xeCreatedTime.InnerText = DateTime.Now.ToString();
XmlElement xeSavedTime = xmlDoc.CreateElement("SavedTime");
xeSavedTime.InnerText = DateTime.Now.ToString();
xeCreationInfo.AppendChild(xeCreatedBy);
xeCreationInfo.AppendChild(xeCreatedTime);
xeCreationInfo.AppendChild(xeSavedTime);
XmlNode xnXwsp = xmlDoc.SelectSingleNode("xxx");
if (xnXwsp != null)
{
xnXwsp.AppendChild(xeCreationInfo);
} //创建并添加<a></a>节点
xeRoot = xmlDoc.CreateElement("a");
if (xnXwsp != null)
{
xnXwsp.AppendChild(xeRoot);
}
//创建并添加<b></b>节点
xeRoot = xmlDoc.CreateElement("b");
if (xnXwsp != null)
{
xnXwsp.AppendChild(xeRoot);
}
//创建并添加<c></c>节点
xeRoot = xmlDoc.CreateElement("c");
if (xnXwsp != null)
{
xnXwsp.AppendChild(xeRoot);
}
//保存XML文档
try
{
xmlDoc.Save(path + fileName + ".xwsp");
}
catch (Exception ep)
{
Console.WriteLine(ep.Message);
}
}

结果如下:

 <?xml version="1.0" encoding="utf-8"?>
<xxx version="1.0" name="workspace1">
<CreationInfo>
<CreatedBy>Tektronix Course Editor</CreatedBy>
<CreatedTime>2015/10/1 14:43:56</CreatedTime>
<SavedTime>2015/10/1 14:43:57</SavedTime>
</CreationInfo>
<a />
<b />
<c />
</xxx>

现在还有一个问题没有解决:

要在<?xml version="1.0" encoding="utf-8"?>节点的后面插入<!DOCTYPE xwsp>这个节点,不晓得该怎么做,而且后面那个xwsp是可以改变的,意思就是可以自己定义,比如说我可以把它改为aaa之类的,这个暂时还没找到解决方法

上一篇:idea中创建.xml文件或别的文件


下一篇:C#中如何创建xml文件 增、删、改、查 xml节点信息