*
* xml的作用:1)存储xml格式的数据在文件 2)在网络传输xml的数据 ....
*
* 常用的描述数据的格式
*
* 1)Properteis:java特有的数据格式,java有对应的api。
*
* 2)xml:通用的数据格式,各语言都支持,都有对应的api。
*
* 3)json:通用的数据格式,各语言都支持,都有对应的api。
*
* xml和json对比
* xml:格式-》描述数据更加清晰,占用的内存更大。
* json:格式-》描述数据没有xml清晰,占用的内存小。
*
* xml的语法
*
* 1)xml的声明
*
* <?xml version="1.0" encoding="编码字符集" ?>
*
* 2)xml的数据-》xml的标记进行描述
*
* -》开始标记
* <标记名 属性名="属性的值" 属性名="属性的值" ...>
* a)文件内容 b)子标记
* -》结束标记
* </标记名>
*
* -->开始标记和结束标记之间-可以写(a)文件内容 b)子标记 )-》一般只写一种
*
* 标记名-》对应数据的名字
* 标记的数据描述:
* a)属性 :少量的数据
* b)文本内容 :比较长的数据
* c)子标记:描述相似的多个子数据
XML标记注意点
1)描述数据必须通过标记
2)标记名,属性名等 都是严格区分大小写
3)标记必须有结束 如果标记没有【元素的文本内容】或【子标记】可以直接<标记名/>结束
例如:<person name="李四" age="18" />
4)属性的值必须用(单或双)引号包裹(推荐双引号)
5)xml文件描述数据有且只能有一个根标记
6)标记要正确嵌套
2.xml常用解析:sax和dom解析两种方式
java官方(jdk)提供了javax.xml.parsers包:sax和dom解析xml的包
sax解析特点:
1)基于事件模型,每次读取数据会调用对应的事件
2)每次读取的数据不保存
3)读取消耗的内存小
4)解析数据-复杂
dom解析特点:
1)直接把整个xml文件读取到程序中封装为一个Document对象, Document对象可以得到根标签Element,通过根标签Element,得到各种子标签
2)每次读取的数据保存在document中
3)读取消耗的内存大
4)解析数据-简单
dom和sax对比:
1)sax性能好,处理数据麻烦。
2)dom性能差,处理数据方便。
3)因为一般处理的xml数据量小--实际开发都使用dom。
*
*
* 最基本的xml解析(先sax再dom)
sax解析:
读取xml数据
1)得到sax解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
2)通过工厂得到sax解析器
SAXParser saxParser = factory.newSAXParser();
3)通过sax解析器解析xml文件,并注册用于解析的处理器
saxParser.parse(in,new Handler());
处理器:用于回调的对象,包含了很多处理xml数据的方法,当解析到xml数据的时候,会
调用处理器的对应处理方法。
3.dom解析xml
*
读取xml数据
1)得到dom解析器工厂
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
2)通过工厂得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
3)通过dom解析器解析xml文件,得到对应文件的document对象。
Document doc = builder.parse(in);
4)去doc对象找到所需要的数据
a)找到document对象的跟标记
Element getDocumentElement()
b)找到标记里所有的【指定标记名字】子标记
NodeList getElementsByTagName(String name)
NodeList-》接口-相当于 List<Node>
c)找到标记里文本内容
String getTextContent()
d)找到标记里指定属性名的属性值
String getAttribute(String name)
4.dom和sax对比:
1)sax性能好,处理数据麻烦。
2)dom性能差,处理数据方便。
3)因为一般处理的xml数据量小--实际开发都使用dom。
jdk官方的api:都有明星的缺点
第三方组织提供了对xml解析的jar包(包含了很多class类的功能):jdom,dom4j...
jdom:结合了sax和dom的优点,简化了dom的api。
*
*
* classPath:配置项目需要使用的第三方组织或个人提供的jar文件(类的功能)
* eclipse-》项目-右键-buildpath-》就是用来配置classpath的
*
* jdom的api
*
* 1)读取xml的数据
* 入口-》org.jdom2.input
*
* a)创建解析器
* SAXBuilder sax=new SAXBuilder();
*
* b)通过解析器解析xml文件为document对象
* document doc对象=sax.build(文件)
* -》document是jdom的对象
*
* c)通过document对象找数据
* 1)找到document对象的跟标记
* getRootElement()
2)找到标记里所有的【指定标记名字】子标记
getChildren(java.lang.String cname)
3)找到标记里【指定标记名字】第一个子标记
getChild(java.lang.String cname)
4)找到标记里所有的子标记
getChildren()
3)找到标记里文本内容
getText() -》原始内容
getTextTrim()-》去左右空白的内容
4)找到标记里指定属性名的属性值
getAttributeValue(java.lang.String attname) ->拿到字符串的值
getAttribute(java.lang.String attname).get数字类型Value()-》拿到数字的值
5.jdom的api
*
* 2)把程序的数据写出到xml文件存储
*
* 入口-》org.jdom2.output
*
* 例如:写的数据
张三,18,男
2个朋友:柳岩,17- 刘德华 ,19
*
* 建立xml的格式
* <person name="张三" age="18" sex="男">
* <friend name="柳岩" age="17" >java工程师</friend>
* <friend name="刘德华" age="19">ios工程师</friend>
* </person>
* a)创建document对象-》装我们要写出的xml数据
* 1)创建document对象
* new Document()
*
* 2)创建标记person,friend
* new Element(标记的名字)
*
* 3)设置标记的属性名和属性值
* setAttribute(java.lang.String name, java.lang.String value)
*
* 4)设置标记的文本内容
* setText(java.lang.String text)
*
* --》建立关系
*
* 5)把根标记添加到document对象中
* setRootElement(Element rootElement)
* 6)把标记添加到父标记
* -》父标记.add...(子标记)
* addContent(Content child)
*
* b)利用XMLOutputter的output把document对象的数据
* -》写到指定的输出流对应的数据源里。
*
* 1)创建XML输出器XMLOutputter对象
* new XMLOutputter();
* new XMLOutputter(format格式化的对象);
*
* Format.getPrettyFormat()->漂亮的格式对象
*
* 2)利用xml输出器把【document对象】的数据输出到指定【输出流】对应的数据源里。
* 输出器.output(document对象,输出流);
*
*
* c)更新xml数据
*
1)读取xml数据-》到docuemnt对象中
2)把docuemnt对象中数据做修改
3)把document对象的数据写出到xml中