Dom解析,Sax解析,Pull解析
① 把整个文档先加载到内存中-> Document 所以可以对文档进行修改
② 如果文件比较大 可能会导致内存溢出
编程思路 DocumentBuilderFactory->DocumentBuilder->Document->通过节点获得NodeList->具体的Node
如果想修改 TransformerFactory->Transformer->transform(Souce, result)
public class DomParseTest {
2.
3.@Test
4.public void domParse() throws Exception{
5.//获取DocumentBuilderFactory
6.DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
7.//获取DocumentBuilder
8.DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
9.//通过documentBuilder 解析xml文档获得Document对象
10.Document document = documentBuilder.parse("book.xml");
11.//通过元素的名字可以找到元素的集合
12.NodeList nodeList = document.getElementsByTagName("售价");
13.//nodeList.getLength();
14.for(int i = 0;i<nodeList.getLength();i++){
15.Node node = nodeList.item(i);
16.String content = node.getTextContent();
17.System.out.println(content);
18.}
19.//找到第二个元素
20.Node node = nodeList.item(0);
21.//读出对应节点的文本内容
22.String content = node.getTextContent();
23.System.out.println(content);
24.}
25.
26.@Test
27.public void domModifyxml() throws Exception{
28.DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
29.DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
30.Document document = builder.parse("book.xml");
31.NodeList nodeList = document.getElementsByTagName("售价");
32.Node node = nodeList.item(1);
33.//修改节点的内容
34.node.setTextContent("199.00元");
35.
36.TransformerFactory transformerFactory = TransformerFactory.newInstance();
37.Transformer transformer = transformerFactory.newTransformer();
38.//数据源
39.Source xmlSource = new DOMSource(document);
40.//要输出到的目的地
41.Result outputTarget = new StreamResult("book.xml");
42.transformer.transform(xmlSource, outputTarget);
43.}
44.}
sax
原理 一个元素一个元素解析 解析到一个元素调用相关的方法 startDocument() 文档开始 endDocument 文档结束 startElement 元素开始 endElement元素结束 characters 文本内容
2.public void saxParser() throws Exception{
3.//获取工厂
4.SAXParserFactory parserFactory = SAXParserFactory.newInstance();
5.SAXParser saxParser = parserFactory.newSAXParser();
6.//获取xmlReader通过这个reader可以试着 ContentHandler
7.XMLReader xmlReader = saxParser.getXMLReader();
8.//给xmlReader设置contentHandler contentHandler是一个接口 里面太多的方法没实现
9.//不去直接实现contenthandler 而是继承它默认的实现 DefaultHandler
10.xmlReader.setContentHandler(new Myhandler());
11.//解析xml文档
12.xmlReader.parse("book.xml");
13.}
14.
15.private class Myhandler extends DefaultHandler{
16.
17.@Override
18.public void startDocument() throws SAXException {
19.System.out.println("文档开始");
20.}
21.
22.@Override
23.public void endDocument() throws SAXException {
24.System.out.println("文档结束");
25.}
26.
27.@Override
28.public void startElement(String uri, String localName, String qName, Attributes attributes)
29.throws SAXException {
30.System.out.println("开始标签<"+qName+">");
31.}
32.
33.@Override
34.public void endElement(String uri, String localName, String qName) throws SAXException {
35.System.out.println("结束标签</"+qName+">");
36.}
37.
38.@Override
39.public void characters(char[] ch, int start, int length) throws SAXException {
40.//文本内容
41.String text = new String(ch,start,length);
42.System.out.println("文本内容"+text);
43.}
44.
45.}
调用next方法 解析下一个元素 每调用一次 解析一个元素
Pull
public class PullParserTest {
2.
3.@Test
4.public void pullTest() throws Exception {
5.ArrayList<Book> books = null;
6.Book book = null;
7.// 获取工厂
8.XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance();
9.// 获取到xml的解析器
10.XmlPullParser parser = parserFactory.newPullParser();
11.// 给解析器设置一个输入源
12.// 第一个参数输入流 第二个参数 文档用到的字符编码集
13.parser.setInput(new FileInputStream(new File("book.xml")), "utf-8");
14.// 获取当前事件类型
15.int eventType = parser.getEventType();
16.boolean flag = true;
17.while (eventType != XmlPullParser.END_DOCUMENT && flag) {
18.switch (eventType) {
19.case XmlPullParser.START_TAG:
20.//开始标签
21.//parser.getName 获取当前事件对应的元素名字
22.if("书架".equals(parser.getName())){
23.//创建一个集合
24.books = new ArrayList<>();
25.}else if("书".equals(parser.getName())){
26.//创建一个book 对象
27.book = new Book();
28.}else if("书名".equals(parser.getName())){
29.//给book 对象设置书名的属性
30.book.setTitle(parser.nextText()); //parser.nextText()获取当前节点的下一个文本内容
31.}else if("作者".equals(parser.getName())){
32.//给book 对象设置作者的属性
33.book.setAuthor(parser.nextText());
34.}else if("售价".equals(parser.getName())){
35.//给book 对象设置售价的属性
36.book.setPrice(parser.nextText());
37.}
38.break;
39.case XmlPullParser.END_TAG:
40.//结束标签
41. if("书".equals(parser.getName())){
42.//把book 对象添加到集合中
43. books.add(book);
44. flag = false;
45.}
46.break;
47.}
48.
49.// 调用parser.next方法解析下一个元素 用这个结果来更新eventType 如果解析到文档结束那么就会推出循环
50.// 如果不更新这个eventType 就是死循环
51.eventType = parser.next();
52.}
53.
54.//遍历集合
55.for(Book book1:books){
56.System.out.println(book1);
57.}
58.}
59.
60.}