xml文档解析
XML文档解主要分为四种解析方式,官方提供的两种分别是:DOM 和 SAX,第三方分别是:JDOM 和 DOM4j
测试用的xml文档:
<?xml version="1.0" encoding="UTF-8"?>
<user>
<uname type="3">zhangsan</uname>
<uname type="2">王麻子</uname>
<uname>lisi</uname>
<pwd>
123456
<abcd>
aaaaaaa
<uname type="3">zhaoliu</uname>
</abcd>
<uname>wangwu</uname>
</pwd>
</user>
使用DOM解析如下:
package com.xmldemo; import java.io.IOException;
import java.io.InputStream; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; public class DomTest { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//创建解析的工厂类
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//创建解析
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//获取user.xml的文件流 并且需要保证 xml放在src的根目录
InputStream is = DomTest.class.getClassLoader().getResourceAsStream("user.xml");
//创建文档对象模型
Document document = documentBuilder.parse(is);
//获取指定节点的集合
NodeList nodeList = document.getElementsByTagName("uname");
//遍历并获取
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
System.out.println(element.getTagName() + "----->" + element.getAttribute("type") + "---->" + element.getTextContent());
} }
}
以下是SAX方式解析:
package com.xmldemo; import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class SaxTest {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//创建解析器的工厂类
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//创建解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//获取xml文件流
InputStream is = SaxTest.class.getClassLoader().getResourceAsStream("user.xml");
//创建自己的处理类
MyHandle myHandle = new MyHandle();
//直接进行解析
saxParser.parse(is, myHandle); for (int i = 0; i < myHandle.list.size(); i++) {
System.out.println("SaxTest.main()" + myHandle.list.get(i));
}
}
} /**
* 对XMl处理的方法
* @author Bjsxt2013
*
*/
class MyHandle extends DefaultHandler { public List<String> list = new ArrayList<String>(); private String elementName = null; @Override
public void characters(char[] ch, int start, int length) throws SAXException {
//System.out.println("MyHandle.characters()" + new String(ch, start, length));
if (elementName != null && "uname".equals(elementName)) {
//System.out.println(new String(ch, start, length));
list.add(new String(ch, start, length));
}
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
//System.out.println("MyHandle.endElement()" + qName);
elementName = null;
} @Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//System.out.println("MyHandle.startElement()" + qName);
elementName = qName;
} @Override
public void startDocument() throws SAXException {
//System.out.println("MyHandle.startDocument()");
} @Override
public void endDocument() throws SAXException {
//System.out.println("MyHandle.endDocument()");
}
}
以下是JDom方式解析:
package com.xmldemo; import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List; import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter; /**
* 1.如何动态生成xml文件
* 2.如何解析xml文件
* 3.如何修改xml文件
*
* 如何快速的解析xml文件
* @author Bjsxt2013
*
*/
public class JdomTest { public static void main(String[] args) throws Exception {
String filePath = System.getProperty("user.dir") + "\\src\\create.xml";
//System.out.println(filePath);
//createXml(filePath);
parserXml(filePath);
} /**
* 解析并修改XMl文件
* @param filePath
* @throws JDOMException
* @throws IOException
*/
public static void parserXml(String filePath) throws JDOMException, IOException {
//创建JDom的解析器
SAXBuilder saxBuilder = new SAXBuilder();
//获取XML对象的流
InputStream is = JdomTest.class.getClassLoader().getResourceAsStream("create.xml");
//解析并生成document对象
Document document = saxBuilder.build(is);
//获取根节点
Element rootElement = document.getRootElement();
//修改根节点的属性
rootElement.setAttribute("sno", "9999");
rootElement.setAttribute("type01", "aaaaaaaaaaaaaa");
Attribute type = new Attribute("type", "abcdefg");
rootElement.setAttribute(type); //获取指定的子节点
Element stuName = rootElement.getChild("stuName");
Element abcd = stuName.getChild("abcd");
//获取节点对应的值
//System.out.println("JdomTest.parserXml()" + abcd.getText());
abcd.setText("唐僧");
//The attribute already has an existing parent "student"
//abcd.setAttribute(type); //获取所有的子节点
List<Element> list = rootElement.getChildren();
for (int i = 0; i < list.size(); i++) {
System.out.println("JdomTest.parserXml()" + list.get(i).getName());
}
//创建新的节点
Element score = new Element("score");
score.setText("99");
rootElement.addContent(score);
//再所有的节点之后设置文本内容 不能直接调用setText方法
//rootElement.setText("abcdefghijklmn");
rootElement.addContent("abcdefghij");
//设置写出的格式
Format format = Format.getPrettyFormat();//格式良好的
//Format format = Format.getCompactFormat();//格式紧凑的
format.setEncoding("utf-8");
//将文档对象模型写出到硬盘
XMLOutputter xmlOutputter = new XMLOutputter(format);
xmlOutputter.output(document, new FileOutputStream(filePath));
} /**
* 创建一个XML文件
* @param filePath
* @throws FileNotFoundException
* @throws IOException
*/
public static void createXml(String filePath) throws FileNotFoundException, IOException {
//创建学生节点(根节点)
Element rootElement = new Element("student");
//添加属性
rootElement.setAttribute("sno", "201209888");
//创建姓名节点
Element stuName = new Element("stuName");
//给姓名节点设置值
stuName.setText("柳岩");
//创建年龄节点
Element age = new Element("age");
age.setText("18");
//将节点连起来
rootElement.addContent(stuName);
rootElement.addContent(age); //创建文档对象模型
Document document = new Document(rootElement);
//设置写出的格式
Format format = Format.getPrettyFormat();//格式良好的
//Format format = Format.getCompactFormat();//格式紧凑的
format.setEncoding("utf-8");
//将文档对象模型写出到硬盘
XMLOutputter xmlOutputter = new XMLOutputter(format);
xmlOutputter.output(document, new FileOutputStream(filePath));
}
}
xml文档解析的更多相关文章
- jsoup -- xml文档解析
jsoup -- xml文档解析 修改 https://jsoup.org/cookbook/modifying-data/set-attributes https://jsoup.org/cookb ...
- iOS网络编程笔记——XML文档解析
今天利用多余时间研究了一下XML文档解析,虽然现在移动端使用的数据格式基本为JSON格式,但是XML格式毕竟多年来一直在各种计算机语言之间使用,是一种老牌的经典的灵活的数据交换格式.所以我认为还是很有 ...
- Android XML文档解析(一)——SAX解析
---------------------------------------------------------------------------------------------------- ...
- JAVA读取XML,JAVA读取XML文档,JAVA解析XML文档,JAVA与XML,XML文档解析(Document Object Model, DOM)
使用Document Object Model, DOM解析XML文档 也可参考我的新浪博客:http://blog.sina.com.cn/s/blog_43ac5543010190w3.html ...
- XML 文档解析操作
sing System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security; ...
- MVC模式简单的Xml文档解析加Vue渲染
前端代码: <script src="~/Js/jquery-3.3.1.min.js"></script> <script src="~/ ...
- 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- IOS 解析XML文档
前段时间想找点事做,就是试着看能不能用豆瓣的API做点什么,于是就碰到了这个问题——XML解析. 老师还没讲,只能自己去查. XML文档解析主要有SAX和DOM两种模式,IOS上两种模式都可以用,这里 ...
- SAX解析和生成XML文档
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...
随机推荐
- Unity3D中制作Loading场景进度条
背景 通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长.为了避免这个问题,可以首先加载Loading场景,然后再通过Loading场景来加载主场景.由于Loading场景包含的资源较少,所以 ...
- leveldb 学习笔记之VarInt
在leveldb在查找比较时的key里面保存key长度用的是VarInt,何为VarInt呢,就是变长的整数,每7bit代表一个数,第8bit代表是否还有下一个字节, 1. 比如小于128(一个字节以 ...
- jquery制作省份城市地区多选控件总结
1.弹出的选择框有jquery直接放在body后面,以position:absolute绝对定位,top,left处理位置. 如果想让该选择框位于点选元素下面,则获取点选元素位置 var target ...
- ZT 螨虫的话就不要跟狗多接触,狗的寄生虫很多,还有草地,
病情分析:过敏是治不好的,只能做到避免接触.指导意见:螨虫的话就不要跟狗多接触,狗的寄生虫很多,还有草地,尤其是狗经常去的地方,草地就是螨虫的传播介质.你是过敏性体质除了被免 过敏性源外,还要增强体质 ...
- iOS9系统分享失败问题解决
因为iOS9系统需要设置打开QQ和微信的白名单,如果出现无法分享或者直接提示分享失败,试一下在infoPlist中添加以下白名单 http://wiki.mob.com/ios9-对sharesdk的 ...
- 嗯,开通blog了!
应老师建议,开通博客,“把学习时遇到的疑惑和问题随时用blog记录下来”,“把前期的学习心得写上,有时间最好把自己的学习计划也写上”. 用博客记录自己Linux和其他技术的学习日记,记录下学习实践中遇 ...
- sendto频率过快导致发送丢包
编写一个转发模块,虽然没有要求一转多时要达到多少路(不采用组播的情况下,单纯的一路转成多路),但是本着物尽其用的原则,尽可能测试一下极限. 网络环境:1000M,直连,多网卡 系统:Linux ver ...
- flask-admin章节三:数据库迁移工具 alembic初步使用
1. 概述 基于flask框架构建web,一般会使用sqlchemy(在flask中使用sqlchemy可以参考这里)作为数据库引擎. 这样业务的逻辑就可以做到不跟具体的数据库类型相耦合,具体后端业务 ...
- Oracle 学习方法
参考书籍: oracle实用教程 pdf 深入浅出Oracle: DBA入门.进阶与诊断案例.pdf Oracle 认证 Dba 认证: Oca oracle 初级dba 认证(容易) Ocp o ...
- Ceph剖析:线程池实现
线程池ThreadPool的实现符合生产者-消费者模型,这个模型解除生产者消费者间的耦合关系,生产者可以专注处理制造产品的逻辑而不用关心产品的消费,消费者亦然.当然,生产者消费者之间需要一个连接的纽带 ...