您的位置:首页 > 其它

XML可扩展标记语言

2017-12-13 22:28 239 查看
一、XML可扩展标记语言
1、概念:
XML推出初衷是为了替换HTML,标签名可以直接定义,不能用数字开头 不能使用纯数字 区分大小写,后用做配置文件 封装数据
因为xml具有良好的格式,所以用途非常广泛,比如持久化存储数据 数据交换 数据配置
xml和html的区别:
1)html的标签是固定的,不能扩展。xml的标签是不固定的,可扩展的。
2)html侧重于显示的信息。xml侧重于标识信息的结构。
3)html是不区分大小写的。xml是区分大小写的。xml的语法比html更严谨。
2、组成部分
文档声明:<?xml version="1.0" encoding="utf-8"?>
必须顶行 顶格写
根标签:有且仅有一个根标签
其他标签:有开始标签 一定要有结束标签
标签属性:一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:<Student name="text">
注解:<!-- --> //Comment注释对象
标签里的内容 egg张三:<name>张三</name>
XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理
3、解析思想
DOM解析思想:Document Object Model 文档对象模型(dom4j解析)
将文档一次性 加载进内存 然后将文档各个组成部分抽取为对象
优点: 能够对文档进行增删改查
缺点:耗内存 适用于PC端
SAX解析思想:基于事件 逐行解析,一次读取一行,释放一行(sax解析、pull解析)
优点 :不占内存 适用于移动端
缺点:只能查 不能增删改
二、dom4j解析
读取xml文件步骤:
1、导入DOM4J jar包
2、创建解析器对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new FileInputStream("xml文件名.xml"));
3、获取根标签对象
Element rootElement = doc.getRootElement();
1) rootElement.node(第几个节点);//获取单个节点对象
获取根标签下的子节点(不能获取孙子节点),空白地方也算一个子节点对象
rootElement.nodeIterator();//获取多个节点对象
2) rootElement.element("标签名");//获取第一个子标签对象
rootElement.elements();//获取所有的子标签对象
rootElement.elementIterator();//通过迭代器的方式获取所有的子标签对象
4、获取标签属性对象
Element element = rootElement.element("标签名");
Attribute attribute = element.attribute(第几个属性/"属性名");
attribute.getName();//获取属性的键
attribute.getValue();//获取属性的值
//element.attributes();获取所有的属性对象
//element.attributeIterator();通过迭代器的方式获取所有的属性对象
//element.attributeValue(第几个属性/"属性名");直接获取属性对象的值
5、获取标签内文本
List<Element> list = element.elements();
for(Element ele:list){
String text = ele.getText();//获取文本内容
System.out.println(text);
}
用代码写xml文件步骤:
导入DOM4J jar包
//通过文档帮助类create doc
Document doc = DocumentHelper.createDocument();

//添加一个根标签
Element rootEle = doc.addElement("students");
//添加一个子标签
Element ele = rootEle.addElement("student");
//给student标签添加一个属性
ele.addAttribute("id", "9527");
//给student添加一个名字和学号标签及内容
Element element1 = ele.addElement("sname");
element1.addText("张三");
Element element2 = ele.addElement("sid");
element2.addText("007");

//把内存中doc 写到硬盘上
OutputFormat format1 = OutputFormat.createCompactFormat();
OutputFormat format2 = OutputFormat.createPrettyPrint(); //漂亮的格式
// 在开发阶段 利于我们调试 可以使用漂亮的格式
// 项目开发好之后上线,我们要调整成紧凑格式 减小xml文件的体积
XMLWriter writer = new XMLWriter(new FileOutputStream("mydoc.xml"), format2);
writer.write(doc);
writer.close();


用代码修改xml文件步骤:
//找到你想修改的节点
1)修改属性的值
attribute.setValue("新属性值");
2)修改文本
element.setText("新文本");
3)删除标签、属性
element.detach();
attribute.detach();
// 重新写入到硬盘覆盖掉原文件
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("xml文件名.xml"));
xmlWriter.write(doc);
xmlWriter.close();
附:XPath:主要是用于xml快速获取所需的节点对象
1、导入Dom4j 的jar包 和支持xPath技术的jar包
2、使用xpath方法:
List<Node> list = rootElement.selectNodes("xpath表达式"); 查询多个节点对象
Node nade = rootElement.selectSingleNode("xpath表达式"); 查询一个节点对象
3、xpath表达式
/ 绝对路径 选择该标签下子标签
// 相对路径 该标签下所有标签,表示不分任何层次结构的选择元素。
* 通配符 表示匹配所有元素
[] 条件 表示选择什么条件下的元素
@ 属性 表示选择属性节点,定位一个属性名
and 关系 表示条件的与关系(等价于&&)
not() 取反
text() 文本 表示选择文本内容
egg:String path = "//user[@id='2']/name"; //选出所有user标签中id="2"的user标签下的name标签
三、sax解析
sax解析有两个部分,解析器和事件处理器
解析器就是XMLReader接口,负责读取XML文档,和向事件处理器发送事件(也是事件源)
事件处理器ContentHandler接口,负责对发送的事件响应和进行XML文档处理
为了简化开发提供了ContentHandler的实现类DefaultHandler类
//事件处理器
public class MyContentHandler extends DefaultHandler{
//文档解析开始时调用,该方法只会调用一次
@Override
public void startDocument() throws SAXException {
super.startDocument();
}
//标签开始时调用
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//uri:xml文档的命名空间(用不到)
//localName:标签的名字(用不到)
//qName:带命名空间的标签的名字(使用标签名用这个)
// attributes:标签的属性集
super.startElement(uri, localName, qName, attributes);
}
//解析标签的内容的时候调用
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//ch:当前读取到的TextNode(文本节点)的字节数组
//start:字节开始的位置,为0则读取全部
//length:当前TextNode的长度
super.characters(ch, start, length);
}
//标签结束时调用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
}
//文档解析结束后调用,该方法只会调用一次
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}


//解析器
//获取解析器工厂对象,从而获取解析器对象
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
//使用指定的DefaultHandler解析指定文件
parser.parse(new File("文件名.xml"), new MyContentHandler());
四、pull解析
Xmlpull比Sax更简明,而且不需要扫描完整个流
步骤:
//导入kxml2-2.3.0.jar xmlpull_1_1_3_4c.jar第三方jar包
//获取解析器工厂对象,从而获取解析器对象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
//关联xml文件
parser.setInput(new FileInputStream("文件名.xml"), "utf-8");
//获取事件类型
int type = parser.getEventType();
//XmlPullParser.START_DOCUMENT;	文档开始事件0
//XmlPullParser.END_DOCUMENT;	文档结束事件1
//XmlPullParser.START_TAG; 	开始标签事件2
//XmlPullParser.END_TAG; 	结束标签事件3
//XmlPullParser.TEXT;	代表文本4
while (type != XmlPullParser.END_DOCUMENT) {
String tagName = parser.getName();
switch (type) {
case XmlPullParser.START_TAG:
if("标签名".equals(tagName)){
//操作(javabean)
}else if("标签名".equals(tagName)){
//...
}
break;
case XmlPullParser.END_TAG:
if("标签名".equals(tagName)){
//操作(add)
}
break;
}
//让指针跳到下一行,重新给type赋值,不然就会死循环
type = parser.next()
}
//把内存中的数据序列化到硬盘上去永久保存
//获取解析器工厂对象,从而获取序列化器
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlSerializer serializer = factory.newSerializer();
//设置输出流关联xml文件
serializer.setOutput(new FileOutputStream("文件名.xml"), "utf-8");
//写入文档声明(文档开始)
serializer.startDocument("utf-8", true);//参数二:文档是否独立
//写入开始根标签
serializer.startTag(null, "students");//参数1 命名空间一般给null 参数2 标签名称
//写入根标签的子标签student开始标签
serializer.startTag(null, "student");
serializer.attribute(null, "id", "id值");//写入属性
//写入student标签的子标签name开始标签
serializer.startTag(null, "name");
//写入name标签内文本
serializer.text("文本内容");
//写入name结束标签
serializer.endTag(null, "name");
//同样方法写student标签的子标签age
//写入student结束标签
serializer.endTag(null, "student");
//同样方法写多个student,一般使用循环
//写入结束根标签
serializer.endTag(null, "students");
//文档结束
serializer.endDocument();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml dom4j 解析