最近工作中遇到一个问题,要求创建一个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之类的,这个暂时还没找到解决方法

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

  1. solr 6.0 没有schema.xml未自动创建schema文件

    solr 6.0 没有schema.xml未自动创建schema文件 摘要:在之前的Solr版本中(Solr5之前),在创建core的时候,Solr会自动创建好schema.xml,但是在之后的版本中 ...

  2. XML学习总结(二)——XML入门

    XML学习总结(二)——XML入门 一.XML语法学习 学习XML语法的目的就是编写XML 一个XML文件分为如下几部分内容: 文档声明 元素 属性 注释 CDATA区 .特殊字符 处理指令(proc ...

  3. XML学习笔记(1)--XML概述

    XML基本概念 XML—extensible Markup Language(可扩展标记语言) XML最基本的三个概念 1)XML语言---描述事物本身(可扩展) 2)XSL语言---展现事物表现形式 ...

  4. 2.6.1 XML配置:创建XML文件

    (1) 工程名右击---New--file  --  newfile窗口中:filename中输入testng.xml testng.xml 文件中打开后,切换到source 标签中.进行编辑. 内容 ...

  5. XML学习——java解析xml文件

    递归获取每个标签 package test; import java.io.File; import java.util.List; import org.dom4j.Document; import ...

  6. XML学习总结(一)——XML介绍

    一.XML概念 Extensible Markup Language,翻译过来为可扩展标记语言.Xml技术是w3c组织发布的,目前推荐遵循的是W3C组织于2000发布的XML1.0规范. 二.学习XM ...

  7. XML学习笔记——关于XML解析器

    本篇文章基于W3C而写 在Firefox及其他浏览器中的XML解析器(除IE) var xmlDoc=document.implementation.createDocument("&quo ...

  8. XML学习笔记之XML的简介

    最近,自学了一段时间xml,希望通过学习笔记的整理能够巩固一下知识点,也希望把知识分享给你们(描红字段为重点): XML(extensible Markup language):可扩展的标记语言,解决 ...

  9. C# -- 使用XmlDocument或XDocument创建xml文件

    使用XmlDocument或XDocument创建xml文件 需引用:System.Xml; System.Xml.Linq; 1.使用XmlDocument创建xml(入门案例) static vo ...

随机推荐

  1. 一种集合“相等性”的实现

        最近在工作中遇到了一个小的功能,就是需要向一个服务发送请求命令,需要判断请求是否发生变化,如果发生变化了,则重新请求.该问题实际上就是判断两个集合是否相等,只需要记录最后一次请求的元素的集合, ...

  2. iOS——Core Animation 知识摘抄(一)

    本文是对http://www.cocoachina.com/ios/20150104/10814.html文章的关键段落的摘抄,有需要的看原文 CALayer和UIView的关系: CALayer类在 ...

  3. AWS系列之二 使用EC2

    在本文中我们有三个任务. 第一:使用Amazon management console创建一个EC2实例. 第二:使用本地的命令行工具远程登陆到该EC2实例. 第三:在该EC2实例上创建一个web服务 ...

  4. 由ASP.NET所谓前台调用后台、后台调用前台想到HTTP——理论篇

    工作两年多了,我会经常尝试给公司小伙伴儿们解决一些问题,几个月下来我发现初入公司的小朋友最爱问的问题就三个 1. 我想前台调用后台的XXX方法怎么弄啊? 2. 我想后台调用前台的XXX JavaScr ...

  5. Redmined的历史记录显示 "Updated by {{author}} {{age}} ago"

    最近Redmine出了点问题,简单查了一下,是ruby的本地冲突包i18n导致的, 先到redmine中跑命令: gem list --local,  查出本地ruby安装的所有的包 这里可以看到i1 ...

  6. IOS Animation-CAShapeLayer、UIBezierPath与Animation的结合

    在阅读本文之前,对CAShapeLayer.UIBezierPath不熟悉的话,可以先阅读文章 贝塞尔曲线与Layer 如果对动画不熟悉的话,先阅读文章 动画基础.深入 Layer是绘图的画板,Bez ...

  7. [Java面试一]面试复习大纲.

    一.Java基础部分 (搞定所有技术之后才考虑复习的技术点) 1.数组中的排序问题(笔试或者机试,前者可能性更大) 2.面向对象的理解 3.集合相关的问题,比如hashmap跟hashtable的区别 ...

  8. 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)

    通常情况下,我们判断一个字符串中是否存在某值常常会用string.contains,其实判断一个字符串中存在某值的方法有很多种,最常用的就是前述所说的string.contains,相对来说比较常用的 ...

  9. 类的继承和多态性-编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,

    编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 ...

  10. SQL Server的日期和时间类型

    Sql Server使用 Date 表示日期,time表示时间,使用datetime和datetime2表示日期和时间. 1,秒的精度是指使用多少位小数表示秒 DateTime数据类型秒的精度是3,D ...