Dom和sax
解析区别:
1.dom:(Document Object Model,文档对象模型) W3C组织推荐的一种处理方式
sax:(Simple API for
XML)不是官方标准,但它是XML社区事实上的标准,几乎所有的
XML解析
器都支持它。
2.使用Dom解析
XML文档时,需要读取整个XML文档,在
内存中
架构架构代表整个DOM树的Document
对象,从而再对XML文档进行操作。在此种情况下,如果xml文档特别大,就会消耗计算机的大量
内存,并且容易导致内存溢出。
SAX解析允许在操作读取文档的时候,即对文档进行处理,而不必等到整个文档加载完才会对
文档进行操作。
-------------DOM4J---------------------------
1.Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开
发的。与JDOM不同的是,dom4j使用
接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提
供了比JDOM更好的灵活性。
2.Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很
多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
3.使用Dom4j开发,需下载dom4j相应的jar文件。
DOM4j中,获得Document对象的方式有三种:
class="java" name="code">
1.读取XML文件,获得document对象
SAXReader reader = newSAXReader();
Document
document = reader.read(new File("input.xml“ ));
2.解析XML形式的文本,得到document对象.
String text = "<members></members>";
Document
document = DocumentHelper.parseText(text);
3.主动创建空document对象.
Document document = DocumentHelper.createDocument();
//创建根节点
Element root =document.addElement( "members");
元素Element操作:
//获取文档的元素.
Element root = document.getRootElement();
//获取某个元素的指定名称的第一个子节点.
Elementelement = element.element(“书名");
//获取某个元素的指定名称的所有子元素的集合
List list = element.elements(“书名”);
//添加一个指定名称的子元素
Element childEle = parentEle.addElement(“书名”);
//删除某个元素指定的子元素
parentEle.remove(childEle);
属性Attribute操作
//获取某个元素的指定名称的属性对象
Attribute attr = element.attribute(“id”);
//获取某个元素的指定名称的属性值
String id = element.attributeValue(“id”);
//给元素添加属性或更新其值
Attribute attr =element.addAttribute(“id”,”123”);
//删除某个元素的指定属性
element.remove(attribute);
文本Text的操作
//获取某个元素的文本内容
String text = element.getText();
//给某个元素添加或更新文本内容
element.setText(“Tom”);
将文档写入XML文件.
1.文档中全为英文,不设置编码,直接写入的形式.
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
2.文档中含有中文,设置编码格式写入的形式.
OutputFormat format =OutputFormat.createPrettyPrint();// 指定XML编码
format.setEncoding( “utf-8");
XMLWriter writer = new XMLWriter(newFileWriter( "output.xml“
),format);
writer.write(document);
writer.close();
Xpath介绍:
1. 在xml文档中查找信息的语言
2. 通过元素和属性进行查找
3. 简化Dom4j查找节点的过程
4. /students/student
5. 从根元素开始逐层找,以”/”开头
6. //name
7. 直接获取所有name元素对象,以“//”开头
8. //student/*
9. 获取所有student元素的所有子元素对象
10. //student[1]或//student[last()]
11. 获取所有student元素的第一个或最后一个
12. //student[@id]
13. 获取所有带id属性的student元素对象
14. //student[@id=‘002']
15. 获取id等于002的student元素对象
l 获取所有符合条件的节点
? document.selectNodes(StringxpathExpression)
返回List集合
l 获取符合条件的单个节点
? document.selectSingleNode(StringxpathExpression)
? 返回一个Node对象。
? 如果符合条件的节点有多个,那么返回第一个。
Eg:
publicvoid testGetPriceByName() throws Exception {
// 加载xml文件
Document document = getDocument();
String xpath="//书[@书名='JavaScript网页开发']/售价";
List<Node> nodes= document.selectNodes(xpath);
for(Node node:nodes){
if(node.getName().equals("售价")){
System.out.println(node.getText());}
} }
------------SAX解析----------
SAX解析思想:解析器和事件
处理器
1.解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档
2.解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会调用
事件处理器的一个方法,解析器在调用事件处理器的方法时,就把当前解析到的xml的文件内容
作为参数,传递给事件处理器。
3.
程序员编写事件处理器,通过事件处理器中方法的参数,得到解析的数据,对数据进行操作。
eg:
//1.创建解析工厂对象
SAXParserFactory factory=SAXParserFactory.newInstance();
//2.用工厂对象产生解析器对象
SAXParser parser= factory.newSAXParser();
//3.用解析器对象得到一个读取器对象
XMLReader xmlReader=parser.getXMLReader();
//4.给读取器设置一个处理器
xmlReader.setContentHandler(newMyContentHandler() );
//用解析器去读取book.xml
xmlReader.parse("src\\cn\\itcast\\day02\\book.xml");
其中MyContentHandle继承制
DefaultHandler类,覆写需要的方法:
1.startDocument()
2.endDocument()
3.startElemnet()
4.endElment();
5.characters();
其中得到属性的方法:
attributes.getValue("方法名");
注:sax只能用于读取xml文件,无法作更新
------------Dom解析-----------------
主要的概念:
Node:xml文件所有对象的根接口 节点
Document:代表xml文件的整个内容的对象的接口
Element:代表某个元素或标签的对象的接口
Attr:代表某个元素的某个属性对象的接口
Text:代表标签体文本内容对象的接口
NodeList:代表包含多个Node接口对象的集合对象
可以对标签进行增(create)删(Delete)改(update)查(read)----CRUD
读:查看所有的数据 有条件的查询数据
写入:将一个User对象的信息保存为一个user标签
更新:创建一个有数据的user对象,根据其中的某个属性数据值去找对应的user标签,
将user对象的数据放到此user标签中
删除:删除所有user标签,有条件的删除:id=2删除对应的user标签
操作的基本步骤:
1.加载xml文件得到Document()
Document document = getDocument();
2.得到根标签(uers标签)
Element usersEle =document.getDocumentElement();
3.得到跟标签的所有子标签(得到Users标签的所有子标签,返回一个NodeList)
NodeList nodeList =usersEle.getElementsByTagName("user");
4.遍历List进行操作。
for(int i=0;i<nodeList.getLength();i++){}
常用的方法:文档解析器工厂---->解析器对象----->用解析器解析xml文件得到Document对象
private Document getDocument() throwsParserConfigurationException,
SAXException,IOException {
//创建一个文档解析器工厂对象
DocumentBuilderFactorybuilderFactory = DocumentBuilderFactory
.newInstance();
//根据工厂对象得到解析器对象password
DocumentBuilderbuilder = builderFactory.newDocumentBuilder();
//用解析器解析xml文件得到Document对象
Documentdocument = builder.parse(new File(
"H:\\workspace\\day01\\src\\cn\\itcast\\dom\
\
users.xml"));
returndocument;
}
保存信息: 思路:转移器工厂对象---->通过工厂得到转移器---->通过转移器将Document的数
据转移到文件中去
private void saveDocument(Documentdocument)
throwsTransformerFactoryConfigurationError,
TransformerConfigurationException,TransformerException {
// 创建一个转移器工厂对象
TransformerFactory factory =TransformerFactory.newInstance();
// 通过工厂对象得到一个转移器
Transformer transformer =factory.newTransformer();
// 通过转移器将Document的数据转移到users.xml文件中去
DOMSource xmlSource = newDOMSource(document);
StreamResultoutputTarget = new StreamResult(new File(
"H:\\workspace\\day01\\src\\cn\\itcast\\dom\
\users.xml"));
transformer.transform(xmlSource,outputTarget);
}
Node appendChild(newChild) 将新的节点添加为最后一个子节点
insertBefore(newChild,refChild) 在某个子节点前插入一个新子节点
removeChild(oldChild) 删除指定的某个子节点
replaceChild(newChild,oldChild) 将指定的子节点替换成新的子节点
setTextContent(textContent) 设置文本内容(一般用在元素对象上)
getNodeName() 得到节点名称(一般用在元素对象上)
getParentNode() 得到父节点(一般用在元素对象上)
getTextContent() 得到文本内容(一般用在元素对象上)
getFirstChild() 得到第一个子节点
getLastChild() 得到最后一个子节点
getNextSibling() 得到下一个兄弟节点
getPreviousSibling() 得到上一个兄弟节点
Document
createElement(name) 创建一个指定名称的标签对象返回
getDocumentElement() 得到xml文件根标签
getElementById(id) 根据id属性值获取一个子标签对象
getElementsByTagName(name) 根据标签名得到所有对应的子标签
Element
setAttribute(name,value) 设置属性的名称和值
removeAttribute(attrName) 根据属性名删除对应的属性值
getAttribute(attrName) 根据属性名得到相应的属性值
getElementsByTagName(name) 根据标签名得到对应的子标签
getTagName() 得到标签名
Attr、Text 极少直接操作这两个接口的对象,一般通过Element对象来操作
NodeList getLength()得到包含的节点对象的个数 item(index)根据下标得到某个节点
转自:http://blog.csdn.net/wd916913/article/details/8088033