用dom和sax对xml文档进行解析,可以使用已开发的xml解析开发包,我们直接调用即可。xml解析开发包有:Jaxp(最差)、Jdom(一般)、dom4j(最好)。
JAXP: 定义一个xml文档:
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名 name="xxxx">java就业培训课程</书名>
<作者>张孝祥</作者>
<售价>109元</售价>
<售价>39.00元</售价>
</书>
<书>
<书名>javaScript网页开发</书名>
<作者>张孝祥</作者>
<售价>109元</售价>
<售价>28.00元</售价>
</书>
</书架>
Jaxp解析xml文档的代码:
package xml;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
public class Demo2 {
public static void main(String[] args) throws Exception {
//1、创建工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//2、得到dom解析器
DocumentBuilder builder=factory.newDocumentBuilder(); //newDocumentBuilder()返回dom解析器
//3、解析xml文档,得到代表文档的document
Document document= builder.parse("src/xml/book.xml");
}
}
这样会得到文档的document对象,再对这个对象进行操作即可。
例:
package xml;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
//使用dom方式对xml文档进行crud
public class Demo3 {
//读取xml文档中:<书名>javaScript网页开发</书名> 节点中的值
@Test
public void read1() throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //创建一个工厂
DocumentBuilder builder=factory.newDocumentBuilder(); //newDocumentBuilder()返回dom解析器,得到解析器
Document document= builder.parse("src/xml/book.xml"); //解析文档,拿到代表文档的document
NodeList list=document.getElementsByTagName("书名"); //根据标签名“书名”返回内容集合
Node node=list.item(1); //下标从0开始,取第二个元素
String content=node.getTextContent(); //得到节点里的文本内容
System.out.println("read1:");
System.out.println(content);
System.out.println();
}
//得到xml文档中的所有节点(标签):使用递归,先得到根节点,再一层层往下找子节点
@Test
public void read2() throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //创建一个工厂
DocumentBuilder builder=factory.newDocumentBuilder(); //newDocumentBuilder()返回dom解析器,得到解析器
Document document= builder.parse("src/xml/book.xml"); //解析文档,拿到代表文档的document
//得到根节点
Node root=document.getElementsByTagName("书架").item(0); //因为只有一个根节点,集合中只有一个元素,直接.item(0)即可得到
System.out.println("read2:");
//得到根节点的孩子(递归方法)
list(root);
System.out.println();
}
private void list(Node node) {
if(node instanceof Element){ //判断node是不是标签,是标签才打印,否则打印结果会出现#text
System.out.println(node.getNodeName()); //打印得到的节点的名称
}
NodeList list=node.getChildNodes(); //得到所有孩子,返回一个集合
for(int i=0;i<list.getLength();i++){ //遍历这个集合
Node child=list.item(i); //得到每一个孩子
list(child); //迭代,得到孩子的孩子
}
}
//得到xml文档中标签属性的值:<书名 name="xxxx">java就业培训课程</书名> 即name的值
@Test
public void read3() throws Exception{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //创建一个工厂
DocumentBuilder builder=factory.newDocumentBuilder(); //newDocumentBuilder()返回dom解析器,得到解析器
Document document= builder.parse("src/xml/book.xml"); //解析文档,拿到代表文档的document
/*
* getAttributes()会得到节点的所有属性,必须要再进行一次遍历才行,这样较麻烦,
* 直接将bookname强制转换成Element(在已知的情况下才能转换)
* */
Element bookname=(Element) document.getElementsByTagName("书名").item(0); //得到第一个书名标签
String value=bookname.getAttribute("name"); //得到name属性的值
System.out.println("read3:");
System.out.println(value);
}
}
运行结果:
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有