网站首页 > java教程 正文
解析xml文档
Dom解析
Sax解析
Pull解析
Dom解析
① 把整个文档先加载到内存中-> 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 文本内容
@Test
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方法 解析下一个元素 每调用一次 解析一个元素
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.}
猜你喜欢
- 2024-10-17 Qt开发-DOM方式解析XML(qt开发工具)
- 2024-10-17 JAVA 操作笔记-XML(六)(xml在java中怎么用)
- 2024-10-17 作为一名程序猿,你不可不知的Java基础知识的三十个经典问答
- 2024-10-17 Android中XML文件解析,现在了解还不晚
- 2024-10-17 JSP 标准标签库(JSTL)(jsp标签库有哪些)
- 2024-10-17 Spring源码阅读:Spring XML解析机制
- 2024-10-17 XML文件(xml文件怎么打开)
- 2024-10-17 Python如何解析HTML和XML数据(python解析html xml最好的模块)
- 2024-10-17 深入解析Python中的XML处理:理论与实践的结合
- 2024-10-17 XML的解析方式(xml的解析方式有哪些)
你 发表评论:
欢迎- 05-16SpringBoot整合Redis实现常用功能
- 05-16基于Redis实现简单的延时消息队列
- 05-16安装Redis
- 05-16Spring系列之Redis的两种集成方式
- 05-16Django连接Redis集群问题排查思路和总结
- 05-16只需5分钟,完成Redis所有命令操作~
- 05-16熟练使用 Redis 的 5 大数据结构:Java 实战教程
- 05-16Redis 常见业务场景及实例(Java)
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)