常用描述数据的格式
properties:一种简单数据的格式,java特有的
xml:一种复杂数据的格式,各语言通用。描述清晰,格式复杂
json:一种复杂数据的格式,各语言通用。描述没有xml清晰,格式简单
XML
概念:可扩展标记语言,一种描述数据的格式
作用:1)方便存储复杂数据在文件2)方便在网络传输复杂数据
xml的语法
1)声明
<?xmlversion="1.0" encoding="GB2312" standalone="yes"?>
version:版本
encoding:当前xml文件编码字符集
standalone(可选):表示xml是否需要关联一个定义XML可用标记的文件(dtd,xsd..)。
2)xml标记(描述数据)
语法:
开始标记:
<开始标记名 属性名1="属性值1" 属性名2="属性值2" ....>
【文本内容】或【子标记】
</结束标记名>
注意:
1)xml语言严格区分大小写
2)开始标记名与结束标记名必须一致
3)标记名,属性名,命名和对应的数据一致
4)标记的数据存储:属性:短字符数据
文本内容:长字符数据
子标记:存储多个类似复杂数据
5)xml的根标记只有一个
6)标记要正确嵌套
7)属性的值必须用(单或双)引号包裹
8)开始标记和结束标记之间如果没有内容--格式可以简化
语法:<开始标记名 属性名1="属性值1".../>
xml中特殊字符
字符 > < & “ ‘
实体引用 > < & " '
cdata标记:可以只能在标记中定义特殊的字符 <![CDATA[文本内容 ]]>
ax解析特点:
1)基于事件模型,每次读取数据会调用对应的事件(方法)
2)每次读取的数据不保存
3)读取消耗的内存小
4)解析数据-复杂
dom解析特点:
1)直接把整个xml文件读取到程序中封装为一个Document对象, Document对象可以得到根标签Element,通过根标签Element,得到各种子标签
2)每次读取的数据保存在document中
3)读取消耗的内存大
4)解析数据-简单
dom和sax对比:
1)sax性能好,处理数据麻烦。
2)dom性能差,处理数据方便。
3)因为一般处理的xml数据量小--实际开发都使用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数据的时候,会
调用处理器的对应处理方法
dom解析:
读取xml数据
1)得到dom解析器工厂
DocumentBuilderFactoryfactory =DocumentBuilderFactory.newInstance();
2)通过工厂得到dam解析器
DocumentBuilder builder = factory.newDocumentBuilder();
3)通过dom解析器解析xml文件,得到对应文件的document对象。
Document doc = builder.parse(in);
4)通过document对象找xml的数据
API
1)获取document里跟标记
document.getDocumentElement();
2)通过指定的子标记名,找到所有的子标记
getElementsByTagName
返回值NodeList -》类似于List<Node> Node是element的超类型
3)通过指定的属性名-获取属性值
getAttribute
4)找到所有的子标记
getChildNodes()
5)找到标记的文本内容
getTextContent
第三方的xml解析:
jdom,dom4j等,建立在dom和sax之上优化性能。
使用jdom的步骤
1)让项目知道jdom的类的功能
-》给项目配置classpath(类的路径)
如果项目需要用到第三方jar的功能,那么需要把第三方jar配置到classpath
jar:压缩文件,包含了很多class文件..
eclipse配置classpath 选中项目-》右键-》buildpath-》config...
jdom解析xml
a)读取xml数据
入口api:org.jdom2.input包
1)创建解析器SAXBuilder
2)通过解析器解析xml文件得到对应文件的document对象。
3)通过document对象找xml的数据
常用api:
1)doc找根标记
getRootElement()
2)ele找所有子标记
getChildren()
3)ele找指定名字的子标记
getChild(java.lang.Stringcname)
4)ele找指定属性名的值
getAttributeValue(java.lang.Stringattname)
5)ele找文本内容
getText()