c# xml文件新增同级节点_XML文件生成 柔情只为你懂 2023-01-05 05:16 172阅读 0赞 **利用XMLSpy编辑与约束XML文件操作** **一、XML文件介绍** 可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。 XML文件格式是纯文本格式,在许多方面类似于HTML,XML由XML元素组成,每个XML元素包括一个开始标记( ),一个结束标记()以及两个标记之间的内容,例如,可以将XML元素标记为价格、订单编号或名称。标记是对文档存储格式和逻辑结构的描述。在形式上,标记中可能包括注释、引用、字符数据段、起始标记、结束标记、空元素、文档类型声明( DTD)和序言。 XML文件的作用是可以定义数据交流的标准或系统配置参数,有一段时间预测是可以替代HTML的标签语言,但是后来发展不理想,没有成为HTML网页的替代方案。但是XML文件在数据交流中还是非常有用的,尤其是在进行数据交流标准的定义中,不同用户按事先约定好的XML标签格式传递数据,双方就可以交流数据。其规范性要强于json文件格式 **具体规则如下:** **1、必须有声明语句。** XML声明是XML文档的第一句,其格式如下: <?xml version="1.0" encoding="utf-8"?> **2、注意大小写** 在XML文档中,大小写是有区别的。" "和" "是不同的标记。注意在写元素时,前后标记的大小写要保持一致。 **3、XML文档有且只有一个根元素** XML文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。例如 <?xml version="1.0" encoding="utf-8"?> XXXXXX **4、属性值使用引号** 在HTML代码里面,属性值可以加引号,也可以不加。但是XML规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。 <?xml version="1.0" encoding="utf-8"?>XXXXXX **5、所有的标记必须有相应的结束标记** 在HTML中,标记可以不成对出现,而在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。 <?xml version="1.0" encoding="utf-8"?>张一男 21 王一女 19 **6、所有的空标记也必须被关闭** 空标记是指标记对之间没有内容的标记,比如"![Image 1][]"等标记。在XML中,规定所有的标记必须有结束标记。 二、**XMLSpy软件介绍** XMLSpy 是来自Altova的一款方便实用,功能强大的XML(标准通用标记语言的子集)编辑器。软件支持WYSWYG,支持Unicode、多字符集,支持Well-formed和Validated两种类型的XML文档,支持NewsML等多种标准XML文档的编辑,软件在原来的基础上增加了几个很有用的功能,会让XML代码的处理更容易,是J2EE,.NET和数据库开发人员不可缺少的高性能的开发工具。网上搜索需要的版本安装就可以了。 ![828ce501d1b6bab5ef9eb5c09a548195.png][] XMLSpy 软件界面 ![9a195a93d69fca726e4340c921f11286.png][] XMLSpy 编辑界面 **三、利用XMLSpy软件编辑XML文件** 1、建立一个XML样例文件 首先利用任意文本编辑器,建立一个普通的XML文件,里面含有基本的XML数据结构。 <?xml version="1.0" encoding="UTF-8" ?>张一男 21 2、利用XMLSpy软件生成约束文件 利用**XMLSpy**软件打开此文件,分析生成约束XSD文件。这步很关键。会提示是否应用约束等,基本都是默认确认就可以了。软件自动在XML文件中建立约束的语句。这种方法可以快速生成约束文件,在此基础上进行修改,能够快速完成约束文件的生成。 ![514e8e5a0f92d2a883d192301833cda5.png][] 带有约束的XML文件 ![10dcd10ab6e4cafc8b0cd770f923e71e.png][] 生成约束文件 ![c80c6ff6d9f1bc4f65193a61effc362f.png][] xsd约束文件 3、修改约束文件xsd 软件自动生成了约束文件xsd,但是这个约束文件有问题。主要是它采用扁平化方法,描述各个元素的层级关系。所谓扁平化描述,就是指描述本层和它所包含的下一层的元素。 注意点: 1 **data是根目录,它只描述的data的类型,和含有的下一级子元素。具体下一级子元素的详细描述,又采用扁平化方法在下面描述了** 2 **在描述中,元素的属性数据类型都进行了约束,问题在于后面采用枚举,限定的数据内容,因此需要把枚举的内容删除掉。** 3 **在元素的描述中,没有限定数据数量,默认就是1个。应该添加不限定。方法是自己写,或者在添加一个元素,然后再生成约束文件,分析文件就可以了。** ![2b603f6ec1d05a3702c0a7079df6ef6c.png][] xsd约束文件 4、XML可视化 XMLSpy软件提供了一种可视化结构展示,非常方便查看自己的XML约束条件。 ![89e8a7f9e46365a660f1cba6da3db526.png][] xml可视化 5、约束文件地址修改 XML文件中引用的约束文件为绝对地址,不适合发布使用。把它修改为相对地址,xml和xsd文件在同一个文件夹中。 ![88bee672421ed85fc1eac2a5d16551fa.png][] xsd地址 6、约束检查 XML约束检查,如果是用XMLSpy软件,如果有问题,会报错,不让保存。根据提示错误,可以修改xsd文件或者XML文件 ![1914925e7342e9991a30fa2425eb13ed.png][] 约束检查结果 **四、pycharm软件中生成约束xsd文件** 利用pycharm也可以生成XSD文件,但是文件的描述感觉没有XMLSpy软件描述的清晰,如下图,不适用。Pycharm不能进行XML规则检查。 ![4cd79ad8903a08b145eb274692b7a81e.png][] pycharm编辑xml ![26ac2ac3934f5e1f62f058ff8f7a03ce.png][] xml文件 **五、Python读写XML文件** 常见的 XML 编程接口有 DOM 和 SAX,这两种接口处理 XML 文件的方式不同,当然使用场合也不同。 Python 有三种方法解析 XML,就是SAX,DOM,以及 ElementTree。 **1.SAX (simple API for XML )** Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。 **2.DOM(Document Object Model)** 将 XML 数据在内存中解析成一个树,通过对树的操作来操作XML。 **3.ElementTree(元素树)** ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。 注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)。 代码如下: # (1)读取XML文件import xml.etree.ElementTree as ETtree = ET.parse('xml001.xml')root = tree.getroot()# (1.1)读取XML字符串# #root = ET.fromstring(country_data_as_string)# #(2)获取element object的四大属性tag、text、attrib以及tail# root.tag #root element的tag# root.text #root element的text# root.attrib #root element本身的attrib,dict格式的# root.tail #root element的tag结束到下一个tag之间的textprint(root.tag)print(root.text)print(root.attrib)print(root.tail)# #(3)通过字典逻辑获取树形结构的text,表示第一个child的第二个child element的text# root[0][1].textprint("---" * 10)print(root[0][0][0].attrib, root[0][0][0][0].tag, root[0][0][0][0].text, root[0][0][0][1].text, root[0][0][0][2].text)# (4)读取XML数据# Element.iter(tag) --遍历当前element树所有子节点的element(无论是子节点还是子节点的子节点),找到符合指定tag名的所有element,如果tag为空则遍历当前element树,返回所有节点element(包含当前父节点)。2.7和3.2之前的版本无此方法,可以用getiterator()代替。# Element.findall(tag) --遍历当前节点的直接子节点,找到符合指定tag名的element,返回由element组成的list# Element.find(tag) --遍历当前节点的直接子节点,找到符合指定tag名的第一个element# Element.get(key) --在当前element中获取符合指定attrib名的valueprint("---" * 10)mydata = root.iter("student")for i in mydata: # print(i.attrib["id"],i[0].text,i[1].text,i[2].text) #方法一 print(i.get("id"), i.find("realname").text, i.find("sex").text, i.find("age").text) # 方法二# (5) 修改XML文件# ElementTree.write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml") --将之前的修改写入XML# Element.set(key,value) --设置element attrib# Element.append(subelement) --新增一个子element,extends(subelements),输入参数必须是一个element序列# Element.remove(subelement) --删除指定tag的elementfor i in root.iter("student"): x = i.find("realname") if x.text == "张二": x.text = "李二小" print("修改数据:", x.text)# (6)保存文件tree.write("xml002.xml", encoding="utf-8", xml_declaration=True, default_namespace=None, method="xml") [Image 1]: [828ce501d1b6bab5ef9eb5c09a548195.png]: /images/20221119/c275b39a9895493fb6430da78944c7ff.png [9a195a93d69fca726e4340c921f11286.png]: /images/20221119/2a3ea4c2b7c146568b0b800c736b6dd0.png [514e8e5a0f92d2a883d192301833cda5.png]: /images/20221119/7ed81c46c97943c69c2c67180062d09f.png [10dcd10ab6e4cafc8b0cd770f923e71e.png]: https://img-blog.csdnimg.cn/img_convert/10dcd10ab6e4cafc8b0cd770f923e71e.png [c80c6ff6d9f1bc4f65193a61effc362f.png]: https://img-blog.csdnimg.cn/img_convert/c80c6ff6d9f1bc4f65193a61effc362f.png [2b603f6ec1d05a3702c0a7079df6ef6c.png]: https://img-blog.csdnimg.cn/img_convert/2b603f6ec1d05a3702c0a7079df6ef6c.png [89e8a7f9e46365a660f1cba6da3db526.png]: https://img-blog.csdnimg.cn/img_convert/89e8a7f9e46365a660f1cba6da3db526.png [88bee672421ed85fc1eac2a5d16551fa.png]: https://img-blog.csdnimg.cn/img_convert/88bee672421ed85fc1eac2a5d16551fa.png [1914925e7342e9991a30fa2425eb13ed.png]: https://img-blog.csdnimg.cn/img_convert/1914925e7342e9991a30fa2425eb13ed.png [4cd79ad8903a08b145eb274692b7a81e.png]: https://img-blog.csdnimg.cn/img_convert/4cd79ad8903a08b145eb274692b7a81e.png [26ac2ac3934f5e1f62f058ff8f7a03ce.png]: https://img-blog.csdnimg.cn/img_convert/26ac2ac3934f5e1f62f058ff8f7a03ce.png
还没有评论,来说两句吧...