xml:extensible markup language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是sgml(standard generalized markup language,标准通用标记语言)。它没有标签集(tag set),也没有语法规则(grammatical rule),但是它有句法规则(syntax rule)。任何xml文档对任何类型的应用以及正确的解析都必须是良构的(well-formed),即每一个打开的标签都必须有匹配的结束标签,不得含有次序颠倒的标签,并且在语句构成上应符合技术规范的要求。xml文档可以是有效的(valid),但并非一定要求有效。所谓有效文档是指其符合其文档类型定义(dtd)的文档。如果一个文档符合一个模式(schema)的规定,那么这个文档是"模式有效的(schema valid)"。 xml文件在存储、交换和传输数据信息上有着很方便处理,那么今天这篇文章主要讲一下用c#如何实现对xml文件的基本操作,如:创建xml文件,增、删、改、查xml的节点信息。所使用的方法很基础,方便易懂(用于自己的学习和记忆只需,同时也希望能够给你带来一些帮助,如有不合适的地方欢迎大家批评指正)。 本文的主要模块为: ① :生成xml文件 ② :遍历xml文件的节点信息 ③ :修改xml文件的节点信息 ④ :向xml文件添加节点信息 ⑤ :删除指定xml文件的节点信息·假设我们需要设计出这样的一个xml文件来存储相应的信息,如下所示:复制代码 代码如下:<computers> <computer id="11111111" description="made in china"> <name>lenovo</name> <price>5000</price> </computer> <computer id="2222222" description="made in usa"> <name>ibm</name> <price>10000</price> </computer></computers> 那么如何生成这个xml文件?又怎么读取这个xml文件的节点信息,以及如何对这个xml文件的节点信息作相应的操作?请看如下代码示例: 【注:因为我们要使用xml相关的语法和方法,所以一定要引入命名空间 system.xml】复制代码 代码如下: using system; using system.collections.generic; using system.linq; using system.text; using system.xml; namespace operatexml { class program { static void main(string[] args) { try { //xml文件存储路径 string myxmlfilepath = "e:\\mycomputers.xml"; //生成xml文件 generatexmlfile(myxmlfilepath); //遍历xml文件的信息 getxmlinformation(myxmlfilepath); //修改xml文件的信息 modifyxmlinformation(myxmlfilepath); //向xml文件添加节点信息 addxmlinformation(myxmlfilepath); //删除指定节点信息 deletexmlinformation(myxmlfilepath); } catch (exception ex) { console.writeline(ex.tostring()); } } private static void generatexmlfile(string xmlfilepath) { try { //初始化一个xml实例 xmldocument myxmldoc = new xmldocument(); //创建xml的根节点 xmlelement rootelement = myxmldoc.createelement("computers"); //将根节点加入到xml文件中(appendchild) myxmldoc.appendchild(rootelement); //初始化第一层的第一个子节点 xmlelement firstlevelelement1 = myxmldoc.createelement("computer"); //填充第一层的第一个子节点的属性值(setattribute) firstlevelelement1.setattribute("id", "11111111"); firstlevelelement1.setattribute("description", "made in china"); //将第一层的第一个子节点加入到根节点下 rootelement.appendchild(firstlevelelement1); //初始化第二层的第一个子节点 xmlelement secondlevelelement11 = myxmldoc.createelement("name"); //填充第二层的第一个子节点的值(innertext) secondlevelelement11.innertext = "lenovo"; firstlevelelement1.appendchild(secondlevelelement11); xmlelement secondlevelelement12 = myxmldoc.createelement("price"); secondlevelelement12.innertext = "5000"; firstlevelelement1.appendchild(secondlevelelement12); xmlelement firstlevelelement2 = myxmldoc.createelement("computer"); firstlevelelement2.setattribute("id", "2222222"); firstlevelelement2.setattribute("description", "made in usa"); rootelement.appendchild(firstlevelelement2); xmlelement secondlevelelement21 = myxmldoc.createelement("name"); secondlevelelement21.innertext = "ibm"; firstlevelelement2.appendchild(secondlevelelement21); xmlelement secondlevelelement22 = myxmldoc.createelement("price"); secondlevelelement22.innertext = "10000"; firstlevelelement2.appendchild(secondlevelelement22); //将xml文件保存到指定的路径下 myxmldoc.save(xmlfilepath); } catch (exception ex) { console.writeline(ex.tostring()); } } private static void getxmlinformation(string xmlfilepath) { try { //初始化一个xml实例 xmldocument myxmldoc = new xmldocument(); //加载xml文件(参数为xml文件的路径) myxmldoc.load(xmlfilepath); //获得第一个姓名匹配的节点(selectsinglenode):此xml文件的根节点 xmlnode rootnode = myxmldoc.selectsinglenode("computers"); //分别获得该节点的innerxml和outerxml信息 string innerxmlinfo = rootnode.innerxml.tostring(); string outerxmlinfo = rootnode.outerxml.tostring(); //获得该节点的子节点(即:该节点的第一层子节点) xmlnodelist firstlevelnodelist = rootnode.childnodes; foreach (xmlnode node in firstlevelnodelist) { //获得该节点的属性集合 xmlattributecollection attributecol = node.attributes; foreach (xmlattribute attri in attributecol) { //获取属性名称与属性值 string name = attri.name; string value = attri.value; console.writeline("{0} = {1}", name, value); } //判断此节点是否还有子节点 if (node.haschildnodes) { //获取该节点的第一个子节点 xmlnode secondlevelnode1 = node.firstchild; //获取该节点的名字 string name = secondlevelnode1.name; //获取该节点的值(即:innertext) string innertext = secondlevelnode1.innertext; console.writeline("{0} = {1}", name, innertext); //获取该节点的第二个子节点(用数组下标获取) xmlnode secondlevelnode2 = node.childnodes[1]; name = secondlevelnode2.name; innertext = secondlevelnode2.innertext; console.writeline("{0} = {1}", name, innertext); } } } catch (exception ex) { console.writeline(ex.tostring()); } } private static void modifyxmlinformation(string xmlfilepath) { try { xmldocument myxmldoc = new xmldocument(); myxmldoc.load(xmlfilepath); xmlnode rootnode = myxmldoc.firstchild; xmlnodelist firstlevelnodelist = rootnode.childnodes; foreach (xmlnode node in firstlevelnodelist) { //修改此节点的属性值 if (node.attributes["description"].value.equals("made in usa")) { node.attributes["description"].value = "made in hongkong"; } } //要想使对xml文件所做的修改生效,必须执行以下save方法 myxmldoc.save(xmlfilepath); } catch (exception ex) { console.writeline(ex.tostring()); } } private static void addxmlinformation(string xmlfilepath) { try { xmldocument myxmldoc = new xmldocument(); myxmldoc.load(xmlfilepath); //添加一个带有属性的节点信息 foreach (xmlnode node in myxmldoc.firstchild.childnodes) { xmlelement newelement = myxmldoc.createelement("color"); newelement.innertext = "black"; newelement.setattribute("ismixed", "yes"); node.appendchild(newelement); } //保存更改 myxmldoc.save(xmlfilepath); } catch (exception ex) { console.writeline(ex.tostring()); } } private static void deletexmlinformation(string xmlfilepath) { try { xmldocument myxmldoc = new xmldocument(); myxmldoc.load(xmlfilepath); foreach (xmlnode node in myxmldoc.firstchild.childnodes) { //记录该节点下的最后一个子节点(简称:最后子节点) xmlnode lastnode = node.lastchild; //删除最后子节点下的左右子节点 lastnode.removeall(); //删除最后子节点 node.removechild(lastnode); } //保存对xml文件所做的修改 myxmldoc.save(xmlfilepath); } catch (exception ex) { console.writeline(ex.tostring()); } } }}上面的这个例子,首先是通过generatexmlfile方法在e盘创建出了我们预想的xml文件;然后通过getxmlinformation方法对刚刚生成的xml文件进行了信息的读取;之后通过modifyxmlinformation方法对xml文件信息作出相应的修改(<computer id="2222222" description="made in usa">修改成为<computer id="2222222" description="made in hongkong">);再之后通过addxmlinformation方法向xml文件中添加了一个带有属性值的color节点;最后通过deletexmlinformation方法将刚刚添加上的color节点删除掉。至此完成了对xml文件的基本操作:创建、读取、修改、添加、删除。【注1:想要将对xml文件所做的任何修改生效的话,必须调用save方法,否则我们所做的修改不会保存】【注2:我们在创建节点的时候用的是xmlelement,但是读取节点信息的时候却用的是xmlnode,这里强调一点:xmlelement是xmlnode的继承,可以调用更多的方法 实现相应所需的功能】 最后简单集中的总结一下对xml进行操作的基本方法,如下所示:复制代码 代码如下: //所需要添加的命名空间 using system.xml; //初始化一个xml实例 xmldocument xml=new xmldocument(); //导入指定xml文件 xml.load(“xml文件路径path”); //指定一个节点 xmlnode root=xml.selectsinglenode("节点名称"); //获取节点下所有直接子节点 xmlnodelist childlist=root.childnodes; //判断该节点下是否有子节点 root.haschildnodes; //获取同名同级节点集合 xmlnodelist nodelist=xml.selectnodes("节点名称"); //生成一个新节点 xmlelement node=xml.createelement("节点名称"); //将节点加到指定节点下,作为其子节点 root.appendchild(node); //将节点加到指定节点下某个子节点前 root.insertbefore(node,root.childenodes[i]); //为指定节点的新建属性并赋值 node.setattribute("id","11111"); //为指定节点添加子节点 root.appendchild(node); //获取指定节点的指定属性值 string id=node.attributes["id"].value; //获取指定节点中的文本 string content=node.innertext; //保存xml文件 xml.save(“xml文件存储的路径path”);
- 0
- 0
- 0
- 0
- 0
更多推荐
C#对XML文件的各种操作实现方法
发布评论