学习目标:
定义良好格式的xml文档
使用DOM解析xml文档
使用DOM4J解析文档
元素的命名规则如下:
名称中可以包含字母、数字或者其他的字符
名称不能以数字或者标点符号开始
名称不能以字符“xml”(或者XML、Xml)开始
名称中不能含空格
dom解析 java自带的
解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。
优点:整个文档树在内存中,便于操作;
支持删除、修改、重新排列等多种功能;
缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;
使用场合:一旦解析了文档还需多次访问这些数据;
硬件资源充足(内存、CPU)。
sax解析 java自带
为解决DOM的问题,出现了SAX。
SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。
优点:不用事先调入整个文档,占用资源少;
SAX解析器代码比DOM解析器代码小,适于Applet(java小应用程序),下载。
缺点:不是持久的;
事件过后,若没保存数据,那么数据就丢了;
无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;
使用场合:Applet;
只需XML文档的少量内容,很少回头访问;
机器内存少;
注意: DOM和SAX不针对特定语言,只是定义了一些接口,以及部分缺省实现(使用空方法实现接口)
3.JDOM
针对Java的特定文档模型
使用具体类而不使用接口
API大量使用了Java集合类型
4.DOM4J
非常优秀的开源Java XML API
面向接口编程,比JDOM更加灵活
使用Java集合框架处理XML
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document root = builder.parse(new File(“Phone.xml”));
List<Phone> phones = new ArrayList<>();
NodeList nodeList = root.getElementsByTagName("Item");
System.out.println(nodeList.getLength());
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
String title = element.getElementsByTagName("title").item(0).getTextContent();
String link = element.getElementsByTagName("link").item(0).getTextContent();
String description = element.getElementsByTagName("description").item(0).getTextContent();
String pubDate = element.getElementsByTagName("pubDate").item(0).getTextContent();
Phone phone = new Phone();
phone.setDescription(description);
phone.setLink(link);
phone.setPubDate(new SimpleDateFormat("yyyy-MM-dd").parse(pubDate));
phone.setTitle(title);
System.out.println(phone.toString());
}
xml结构
<?xml version="1.0" encoding="UTF-8"?>使用DOM解析数据
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document root = builder.parse(new File(“Phone.xml”));
List<Phone> phones = new ArrayList<>();
NodeList nodeList = root.getElementsByTagName("Item");
System.out.println(nodeList.getLength());
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
String title = element.getElementsByTagName("title").item(0).getTextContent();
String link = element.getElementsByTagName("link").item(0).getTextContent();
String description = element.getElementsByTagName("description").item(0).getTextContent();
String pubDate = element.getElementsByTagName("pubDate").item(0).getTextContent();
Phone phone = new Phone();
phone.setDescription(description);
phone.setLink(link);
phone.setPubDate(new SimpleDateFormat("yyyy-MM-dd").parse(pubDate));
phone.setTitle(title);
System.out.println(phone.toString());
}
使用DOM4J
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new File(“xml/Phone.xml”));
// 2.获取根节点
Element root = document.getRootElement();
// String text= root.getText();// 获取根节点的文本
//根据名称获取所有的Item及诶单
// String text = root.elementText(“title”);
List ndes = root.elements(“Item”);// 获取所有指定子节点
for (int i = 0; i < ndes.size(); i++) {
Element element = (Element) ndes.get(i);
List subNodes = element.elements();//获取所有节点
for (int j = 0; j < subNodes.size(); j++) {
Element subNode= (Element) subNodes.get(j);
System.out.println(subNode.getName()+":" + subNode.getText());
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
使用DOM创建文档
// 得到 Dom解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 创建文本文档
Document d = builder.newDocument();
// 创建 根节点
Element root = d.createElement(“PhoneInfos”);
// 把根节点添加到 文本里面
d.appendChild(root);
for (int i = 0; i < 3; i++) {
Element phone = d.createElement(“phone”);
phone.setAttribute(“id”, “1000”+i);
Element name = d.createElement(“name”);
Node node = d.createTextNode(“张三”+i);
name.appendChild(node);
phone.appendChild(name);
root.appendChild(phone);
}
d.setXmlStandalone(true);
// d.getXmlEncoding()
d.setXmlVersion("1.0");
// 创建变压器 工厂
TransformerFactory tFactory = TransformerFactory.newInstance();
// 得到变压器
Transformer former = tFactory.newTransformer();
// 设置编码方式
former.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
// 是否缩进换行
former.setOutputProperty(OutputKeys.INDENT, "yes");
// 创建source资源
DOMSource domSource = new DOMSource(root);
// 得到一个打印流
OutputStream stream = new FileOutputStream("dom.xml");
former.transform(domSource, new StreamResult(stream));
修改和删除
/1.获取document对象, 读取xml文件
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new File(“xml/Phone.xml”));
// 2.获取根节点
Element root = document.getRootElement();
// 添加节点 并返回被添加的节点
/* Node brandNode = root.addElement(“Brand”);
((Element) brandNode).addAttribute(“type”, “华为”);
brandNode.setText(“华为华为”);*/
root.remove(root.element("Brand"));
// 保存文档
XMLWriter writer= new XMLWriter(new FileWriter(“xml/Phone.xml”));
writer.write(root);
writer.close();
System.out.println("保存成功");