XML-可扩展标记语言
1、扩展名是.xml
2、内部有很多自定义标签
3、注释<!== 注释内容 ==>
4、<?xml version="1.0" encoding="UTF-8" ?>
5、每一个标签都有开标签和关标签
6、标签不能错位嵌套
7、只有一个根节点
8、每个节点都有一个父节点(根节点除外)
9、每个节点都有0-多个子节点。
XML一般有2种用途
1、配置文件是XML格式的
2、前后台交互通过XML格式的字符串进行交互。(需要前后台约定好标签名都是啥)
XML解析有2种
DOM:读入整个XML,解析成Document文档,Document里包含了Node、Attr等信息。这些类型一定与我们想要的类型不一致。Ticket、Order,需要我们自己从Document中提取信息,封装到我们自己的类中。
DOM的优点:解析简单。缺点:占内存多。
SAX:一次读入一行XML,基于事件的处理机制。分为开始解析文档,开始解析标签,读到内容,结束解析标签,结束解析文档。
SAX解析的优点:省内存,缺点:需要自己控制解析过程。
DOM的代码实现
第一步:
要创建Document
但是Document是一个接口,没有办法创建对象。我们说的创建对象,指的是创建接口的实现类对象。
通过DocumentBuilder获取Document对象。
但是DcoumentBuilder是抽象类,不能创建对象。
DocumentBuilderFactory类可以帮你获得DocumentBuilder对象。
DoucmentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newInstance();
Document doc = db.parse(“src\students.xml”);//解析完成,结果放在了doc里。
NodeList list = doc.getElementsByTagName(“Student”);
for(int i = 0; i < list.getLength(); i++){
Node student= list.item(i);
Attribute id = student.attributes().getNameItem(“id”);
String idStr = id.getNodeValue();
NodeList children = student.childNodes();
Node name = children.item(0);
String str = name.getTextContent();//获取节点的文本内容,如果不是叶子节点,会把子节点的内容一起得到。
}
SAX解析:
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParer sp = spf.newInstance();
Handler hd = new Handler();
sp.parse("src\\students.xml",hd);
public class Handler extends DefaultHandler{
startDocument
endDocument
startElement
endElement
character
}
我不爱使用DOM解析?
因为占内存多,解析不了大文件。
而且从doc中提取信息的时候也麻烦。
我也不在用SAX解析?
因为要自己写解析过程。
dom4j可以解决你的烦恼。
dom4j是第三方提供的jar包。
dom4j的一个组织,它编写的DOM4j框架。而且是市面上最优秀的XML解析框架。性能非常好,超越原生的解析以及各大公司提供的解析框架。
使用起来也非常方便。
使用dom4j的步骤:
1、导包
2、使用
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("路径"));
3、先获取rootElement
Element root = doc.getRootElement();
List<Element> list1 = root.elements();//获取root的所有子节点
List<ELement> list2 = root.elements("student");//获取root下所有叫student的节点。
Element ele = root.element("student");//获取root下叫student的单个元素
Attribute att = ele.attribute("id");//获取ele中名为id的属性。
String id = att.getText();//读取属性的值
String value = ele.getText();//读取元素的值。