day14(xml 编写及解析)
编写
xml的组成:
1.文档的声明
- <?xml version='1.0' encoding='UTF-8' standalone='yes'>
- xml 表示标签的名字
- encoding 编码格式
- standalone 标记此文档是否独立
2.元素(节点),元素属性(使用在不包含标签体中体现)
- a: 包含标签体
- 理解: 简括号全部成对儿出现, 所有的数据都用一对儿简括号存储
- 例:
- <student>
- <name>zhangsan</name>
- <age>18</age>
- </student>
- b: 不包含标签体
- 理解: 只有最外层的一个简括号,括号用/标识结束, 内部的数据都用属性来编写
- <student name="zhangsan" age="18" />
4.注释
- <!-- 注释代码 -->
5.CDATA区(字符串区)
- <students>
- <student>
- <name>zhangsan</name>
- <url>
- <![CDATA[
- <name>zhangsan</name>
- <age>15</age>
- ]]>
- </url>
- </student>
- </students>
6.特殊字符
- <student>
- <name>zhangsan</name>
- <url>
- <it>www.it.com</it>
- </url>
- </student>
7.处理指令(PI:processing Instruction)
暂不做说明
其他组成部分
DTD约束文件
- 在DTD文档中使用ELEMENT关键字来声明一个XML元素。
- •语法:<!ELEMENT 元素名称 使用规则>
- 使用规则:
- •(#PCDATA):指示元素的主体内容只能是普通的文本.(Parsed Character Data)
- •EMPTY:用于指示元素的主体为空。比如<br/>
- •ANY:用于指示元素的主体内容为任意类型。
- •(子元素):指示元素中包含的子元素
- •定义子元素及描述它们的关系:
- –如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
- •如: <!ELEMENT FILE (TITLE,AUTHOR,EMAIL)
- –如果子元素用"|"分开,说明任选其一。
- •如:<!ELEMENT FILE (TITLE|AUTHOR|EMAIL)
- –用+、*、?来表示元素出现的次数
- •如果元素后面没有+*?:表示必须且只能出现一次
- •+:表示至少出现一次,一次或多次
- •*:表示可有可无,零次、一次或多次
- •?:表示可以有也可以无,有的话只能有一次。零次或一次
- •在DTD文档中使用ATTLIST关键字来为一个元素声明属性。
- •语法:
- <!ATTLIST 元素名
- 属性名1 属性值类型 设置说明
- 属性名2 属性值类型 设置说明
- …
- >
- •属性值类型:
- –CDATA:表示属性的取值为普通的文本字符串
- –ENUMERATED (DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)
- –ID:表示属性的取值不能重复
- •设置说明
- –#REQUIRED:表示该属性必须出现
- –#IMPLIED:表示该属性可有可无
- –#FIXED:表示属性的取值为一个固定值。语法:#FIXED "固定值"
- 直接值:表示属性的取值为该默认值
DTD文件编写
- <?xml version="1.0" encoding="UTF-8"?>
- <!ELEMENT class (学生+)>
- <!ELEMENT 学生 (姓名,年龄,性别)>
- <!ELEMENT 姓名 (#PCDATA)>
- <!ELEMENT 年龄 (#PCDATA)>
- <!ELEMENT 性别 (#PCDATA)>
DTD测试文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE 班级 SYSTEM "Test.dtd">
- <class>
- <学生>
- <姓名>张三</姓名>
- <年龄>15</年龄>
- <性别>男</性别>
- </学生>
- </class>
schema约束文件
- Schema约束自身就是一个XML文件,但它的扩展名通常为.xsd
- 一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档。\
- XML Schema对名称空间支持得非常好
- 理解:
- 名称空间: 相当于package
- 约束文档: 编写好的Person类
- 实例文档: 通过Person类创建对象
- <?xml version="1.0" encoding="UTF-8"?>
- <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
- targetNamespace='http://www.fjklmz.com'>
- <!-- xmlns xs:是标准的名称空间 -->
- <xs:element name='书架' >
- <xs:complexType><!-- 是复杂的标签 -->
- <xs:sequence maxOccurs='unbounded' ><!-- 有序 无边界 -->
- <xs:element name='书' ><!-- 元素 -->
- <xs:complexType>
- <xs:sequence>
- <xs:element name='书名' type='xs:string' />
- <xs:element name='作者' type='xs:string' />
- <xs:element name='售价' type='xs:string' />
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- </xs:schema>
使用Schema约束文件来编写xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <fjk:书架 xmlns:fjk="http://www.fjklmz.com"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.fjklmz.com NewXMLSchema.xsd ">
- <书>
- <书名>书名</书名>
- <作者>作者</作者>
- <售价>售价</售价>
- </书>
- </fjk:书架>
解析
解析方式有两种方法
DOM Document Object Model 文档对象实类 这种方式是W3C推荐的处理xml的一种方式
SAX Simple API for Xml 这种方式不是官方提供的,属于开源社区XML-DEV,几乎所有的Xml解析都支持。
解析区别
dom解析 一次性加载全部节点,如果节点太多的话,就会产生节点溢出
sax 一个节点的一个节点的进行解析
JAXP 是SUN公司提供的解析标准
DOM4J Document for Java 是开源组织的推出的解析开发包
log4j 日志文件
- * Dom4J的常用方法:
- * Document
- * Element getRootElement() :获取根元素对象(根标签)
- * Element
- * List elements() :获取所有的子元素
- * List elements(String name):根据指定的元素名称来获取相应的所有的子元素
- * Element element(String name):根据指定的元素名称来获取子元素对象,如果元素名称重复,则获取第一个元素
- * String elementText(String name) :根据指定的子元素名称,来获取子元素中的文本
- * String getText() :获取当前元素对象的文本
- * void setText(String text):设置当前元素对象的文本
- * String attributeValue(String name):根据指定的属性名称获取其对应的值
- * public Element addAttribute(String name,String value):根据指定的属性名称和值进行添加或者修
- MyXml.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <class GDP="999块">
- <students><!-- 学生一 -->
- <student>
- <name>JJ</name>
- <age>15</age>
- </student><!-- 学生二 -->
- <student>刘欢</student>
- <student>
- <name>周杰伦</name>
- <age>30</age>
- </student>
- <Student>
- <name>孙红雷</name>
- <age>15</age>
- </Student>
- </students>
- </class>
编写工具类
- public class Dom4JUtils {
- private Dom4JUtils(){//把构造方法私有化
}- public static Document getDocument() throws Exception{//加载文件的所有节点
- SAXReader reader = new SAXReader();
- Document document = reader.read("src\\day14\\MyXml.xml");
- return document;
- }
- public static void writerXml(Document document) throws IOException{//写回到xml文件中去
- OutputFormat opf=OutputFormat.createCompactFormat();
- opf.setEncoding("UTF-8");
- XMLWriter writer=new XMLWriter(new FileOutputStream("src\\day14\\MyXml.xml"));
- writer.write(document);
- writer.close();
- }
- }
- Element getRootElement() :获取根元素对象(根标签)
- public class TestXml {
- public static void main(String[] args) throws Exception {
- //Element getRootElement() :获取根元素对象(根标签)
- Document document = Dom4JUtils.getDocument();
- Element rootElement = document.getRootElement();
- System.out.println(rootElement.getName());//输出为Class
- }
- }
List elements() :获取所有的子元素
- public class TestXml {
- public static void main(String[] args) throws Exception {
- //Element getRootElement() :获取根元素对象(根标签)
- Document document = Dom4JUtils.getDocument();
- Element rootElement = document.getRootElement();
- System.out.println(rootElement.getName());
//List elements() 获取所有的子元素- List<Element> elements = rootElement.elements();//因为只有一个子节点 所以只输出一个子节点 students
- for (Element element : elements) {
- System.out.println(element.getName());
- }
- }
- }
List elements(String element);//根据指定元素名称来获取相应的所有的子元素
- public class TestXml {
- public static void main(String[] args) throws Exception {
- //Element getRootElement() :获取根元素对象(根标签)
- Document document = Dom4JUtils.getDocument();
- Element rootElement = document.getRootElement();
- // List elements(String name):根据指定的元素名称来获取相应的所有的子元素
- List<Element> elements = rootElement.elements();
- Element element2 = elements.get(0);
- List<Element> elements2 = element2.elements("student");
- for (Element element : elements2) {
- System.out.println(element.getName());
- }
- }
- }
- 输出结果:
student
student
student
Element element();//根据指定元素获取子元素对象,如果有多个则返回第一个
- public class TestXml {
- public static void main(String[] args) throws Exception {
- //Element getRootElement() :获取根元素对象(根标签)
- Document document = Dom4JUtils.getDocument();
- Element rootElement = document.getRootElement();
- //Element element(String name):根据指定的元素名称来获取子元素对象,如果元素名称重复,则获取第一个元素
- Element element = rootElement.element("students");//students
- System.out.println(element.getName());
- }
- }
String elementText(String name) :根据指定的子元素名称,来获取子元素中的文本
String getText() :获取当前元素对象的文本
- public class TestXml {
- public static void main(String[] args) throws Exception {
- //Element getRootElement() :获取根元素对象(根标签)
- Document document = Dom4JUtils.getDocument();
- Element rootElement = document.getRootElement();
- //String getText() :获取当前元素对象的文本
- List<Element> elements = rootElement.elements();
- List<Element> elements2 = elements.get(0).elements();
- //String elementText(String name) :根据指定的子元素名称,来获取子元素中的文本
- System.out.println(elements2.get(0).elementText("name"));//JJ
- List<Element> elements3 = elements2.get(0).elements();
- System.out.println(elements3.get(0).getText());//获取name元素的值 JJ
- }
- }
setText(); 修改标签内容
- public class TestXml {
- public static void main(String[] args) throws Exception {
- //Element getRootElement() :获取根元素对象(根标签)
- Document document = Dom4JUtils.getDocument();
- Element rootElement = document.getRootElement();
- List<Element> elements = rootElement.elements();
- List<Element> elements2 = elements.get(0).elements();
- List<Element> elements3 = elements2.get(0).elements();
- // void setText(String text):设置当前元素对象的文本
- elements3.get(0).setText("JAY");
- System.out.println(elements3.get(0).getText());//获取修改后的name元素的值 JAY
- }
- }
public Element addAttribute(String name,String value):根据指定的属性名称和值进行添加或者修
- public class TestXml {
- public static void main(String[] args) throws Exception {
- //Element getRootElement() :获取根元素对象(根标签)
- Document document = Dom4JUtils.getDocument();
- Element rootElement = document.getRootElement();
- //public Element addAttribute(String name,String value):根据指定的属性名称和值进行添加或者修
- rootElement.addAttribute("name", "WLGC");
- Dom4JUtils.writerXml(document);
- }
- }
MyXml.xml文件被修改
- <class GDP="999块" name="WLGC">
添加功能 addElement(String Element);
- public class TestXml {
- public static void main(String[] args) throws Exception {
- //Element getRootElement() :获取根元素对象(根标签)
- Document document = Dom4JUtils.getDocument();
- Element rootElement = document.getRootElement();
- Element studentElement = rootElement.addElement("student");
- Element nameElement = studentElement.addElement("name");
- nameElement.setText("孙楠");
- Element ageElement = studentElement.addElement("age");
- ageElement.setText("35");
- //设置文本
- Dom4JUtils.writerXml(document);
- }
- }
- <student>
- <name>孙楠</name>
- <age>35</age>
- </student>
删除功能 remove
- public class TestXml {
- public static void main(String[] args) throws Exception {
- //Element getRootElement() :获取根元素对象(根标签)
- Document document = Dom4JUtils.getDocument();
- Element rootElement = document.getRootElement();//students
- List<Element> elements = rootElement.elements();//student
- List<Element> elements2 = elements.get(0).elements();//第一个student
- Element element = elements2.get(4);
- //移除时 必须使用它的父节点删除它的子节点
- element.remove((Element)element.elements().get(0));
- Dom4JUtils.writerXml(document);
- }
- }
- <student>
- <age>35</age>
- </student>
- 插入到指定位置
- public class TestXml {
- public static void main(String[] args) throws Exception {
- //Element getRootElement() :获取根元素对象(根标签)
- Document document = Dom4JUtils.getDocument();
- Element rootElement = document.getRootElement();//students
- Element createElement = DocumentHelper.createElement("student");
- Element nameElement = createElement.addElement("name");
- nameElement.setText("张信哲");
- Element ageElement = createElement.addElement("age");
- ageElement.setText("55");
- List<Element> elements = rootElement.elements();//student
- elements.get(0).elements().add(1, createElement);
- Dom4JUtils.writerXml(document);
- }
- }
- <student>
- <name>JJ</name>
- <age>15</age>
- </student><!-- 学生二 -->
- <student>
- <name>张信哲</name>
- <age>55</age>
- </student>
- <student>刘欢</student>
day14(xml 编写及解析)的更多相关文章
- xml语法、DTD约束xml、Schema约束xml、DOM解析xml
今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...
- Android基础总结(12)——XML和JSON解析
XML和JSON解析 在网络上传输数据时最常用的格式有两种:XML和JSON.本文主要就是学习如何对这两种常用的数据格式进行解析. 1.XML和JSON的定义 XML:扩展标记语言 (Extensib ...
- XML文件的解析方式
XML文件4种解析方式分别是:DOM解析,SAX解析,JDOM解析,DOM4J解析.1.基础方法:DOM:与平台无关的官方的解析方式.SAX:Java平台提供的基于事件驱动的解析方式.2.扩展方法(在 ...
- (5)微信二次开发 之 XML格式数据解析
1.首先理解一下html html的全名是:HyperText Transfer markup language 超级文本标记语言,html本质上是一门标记(符合)语言,在html里,这些标记是事先定 ...
- XML基础+Java解析XML +几种解析方式的性能比较
XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数 ...
- 一起学Android之Xml与Json解析
概述 在网络中,数据交互通常是以XML和Json的格式进行,所以对这两种格式的数据进行解析,是Android开发中的必备功能,本文以一个简单的小例子,简述Android开发中Xml和Json解析的常用 ...
- XML数据的解析
XML数据的解析 相比于JSON数据解析而言,XML数据解析可能会让更多的童鞋感觉到吃力,对我来说,同样认为JSON数据好像让人感觉比较友好,不过对于程序开发者来说,无非就是这两种数据解析占比较大的部 ...
- iOS开发笔记3:XML/JSON数据解析
这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSeri ...
- Silverlight项目笔记7:xml/json数据解析、TreeView、引用类型与数据绑定错误、图片加载、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题
1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应 ...
随机推荐
- Inspector视图中的get/set使用
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { public int width { ...
- Haskell语言学习笔记(66)Aeson
Data.Aeson 安装 aeson $ cabal install aeson Installed aeson-1.2.3.0 Prelude> :m +Data.Aeson Prelude ...
- Haskell语言学习笔记(24)MonadWriter, Writer, WriterT
MonadWriter 类型类 class (Monoid w, Monad m) => MonadWriter w m | m -> w where writer :: (a,w) -& ...
- Access denied for user 'root'@'localhost' (using password:YES)解决方法
Access denied for user 'root'@'localhost' (using password:YES)解决方法 在MySQL的使用过程中,我们可能会碰到“Access denie ...
- 关于struts2中ActionContext类的作用
关于struts2中ActionContext类的作用有三个: 1.获取三大作用域对象及页面参数 2.是struts标签的上下文对象 3.ThreadLocal内装的就是ActionContext 怎 ...
- RNA-seq 安装 fastaqc,tophat,cuffilnks,hisat2
------------------------------------------ 安装fastqc------------------------------------------------- ...
- ping,telnet,tracert分别用的是什么协议
Telnet使用的是tcp协议使用示例:telnet 192.168.1.20 80 ping命令使用的是icmp协议示例:ping www.sina.com.cn或ping 192.168.1.10 ...
- 使用python识别验证码
公司的登录注册等操作有验证码,测试环境可以让开发屏蔽掉验证码,但是如果到线上的话就要想办法识别验证码或必过验证码了. 识别验证码主要分为三部分,一.对验证码进行二值化.二.将二值化后的图片分割.三.进 ...
- VB 共享软件防破解设计技术初探(三)
×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http://bbs.pediy.com/sho ...
- 超薄二维Mo2C晶体
记者今天从中国科学院金属研究所获悉,该所沈阳材料科学国家(联合)实验室先进炭材料研究部任文才研究组在大尺寸高质量二维过渡族金属碳化物晶体的制备与物性研究方面取得了重要突破.相关成果日前在<自然— ...