java中XML文档解析1(Dom)

本文介绍DOM方式解析XML的方法,包括创建、遍历、更新及删除等操作,并提供具体实例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解析XML的方式分为以下几种:

JAXP (JavaApi for Xml Programming) – sun公司的一套操作XML的API.
  • DOM解析-一次性的将数据全部装入内存。
  • SAX解析-边读取边解析。
Dom4j (Document For Java)-第三方开源,是从jdom分裂出来
</pre>的解析技术。目前jdom已经完全被dom4j替代。<ul><li><span style="white-space:pre"></span>jDom – Dom4j的前身。</li><li><span style="white-space:pre"></span>Dom4j在性能和速度上都比sun公司的要快,而且支持Xpath快速查找,目前像Spring,Hibernate这些大型的框架,都是用的dom4j.</li></ul><p>StAX – JDK1.6新特性,做为JAXP的新成员已经集成在了JDK6当中。</p><p></p><p>下面就来演示<span style="color:#ff6666">dom</span>解析:</p><p></p><div>关键包包: </div><div><span style="color:#97CDCC">•</span>javax.xml.parse – 关键类<span style="color:red">DocumentBuilder</span>,文档解析对像。 </div><div><span style="color:#97CDCC">•</span>org.w3c.dom– 关键类<span style="color:red">Document</span>代表内存中的文档对像模型。</div><div><span style="color:#97CDCC">•</span>java.xml– 关键类<span style="color:red">Transformer</span>,用于将内存中的文档保存到文件中。</div><p></p><p>下面是users.xml文件代码</p><p></p><pre code_snippet_id="1735096" snippet_file_name="blog_20160629_2_9510072" name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<users>
<span style="white-space:pre">	</span><user id="A001">
<span style="white-space:pre">		</span><name >张三</name>
<span style="white-space:pre">		</span><age>20</age>
<span style="white-space:pre">	</span></user>
<span style="white-space:pre">	</span><user  id="A002">
<span style="white-space:pre">		</span><name>王建安</name>
<span style="white-space:pre">		</span><age>24</age>
<span style="white-space:pre">	</span></user>
</users>

首先要获得document对象

第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbf对象;

第二步,通过dbf对象创建出一个DocumentBuilder对象;

第三步,通过db对象创建出一个Document对象;

然后通过document对象对dom数进行解析,方法如同javascript的dom解析方法()

需求:把第一个user节点的name的值取出来

下面是解析代码 

                //第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbf对象
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		//第二步,通过dbf对象创建出一个DocumentBuilder对象
		DocumentBuilder db=dbf.newDocumentBuilder();
		//第三步,通过db对象创建出一个Document对象
		Document document=db.parse("./xml3/users.xml");
		Node root=document.getFirstChild();//第一个孩子一定是根节点
		//System.out.println(root.getFirstChild());
		/*这里是#text----dom中把空白符也看成是一个Node,这种情况对我们的解析通常会造成很大的麻烦
		//※※为解决上面的问题,我们以后解析时尽量不要用Node,而要用Element。
		因为Element是元素它不包含属性和文字内容(包括空白符),因此可避开空白符的干扰	*/
		Element eRoot=(Element) root;
		NodeList list=eRoot.getElementsByTagName("user");
		Element eUser1=(Element) list.item(0);
		//要把Node强转成Element,因为Element是子接口,里面有getElementBy*等方法,而Node没有(只能采用childNodes的方式,这种方式会受空白符的干扰)
		NodeList listName=eUser1.getElementsByTagName("name");
		Element eName=(Element) listName.item(0);
		String name=eName.getTextContent();//标签内部所包含的文本内容----innerText
		System.out.println(name);//张三



练习:用Java对xml文档进行CRUD---创建,遍历,更新,删除

记住:要对xml文档进行修改,把内存中的当前dom对象存储到xml文件,步骤如下:
<span style="color:#330033;">TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(dom), new StreamResult("./xml4/users.xml"));//把xml源 输出到 目标 ---如果目标存在则是更新,否则是创建</span><span style="color:#ff0000;">
</span>

  • 创建 --需求:添加一个新的user
          public void create() throws SAXException, IOException, ParserConfigurationException, TransformerException{
		//第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbf对象
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		//第二步,通过dbf对象创建出一个DocumentBuilder对象
		DocumentBuilder db=dbf.newDocumentBuilder();
		//第三步,通过db对象创建出一个Document对象
		Document document=db.parse("./xml3/users.xml");
		Node root=document.getFirstChild();//第一个孩子一定是根节点
		//创建一个新的user
		Element eUser=document.createElement("user");
		eUser.setAttribute("id", "C003");
		Element eName=document.createElement("name");
		eName.setTextContent("Tom");
		//添加到user节点上
		eUser.appendChild(eName);
		Element eAge=document.createElement("age");
		eName.setTextContent("50");
		//添加到user节点上
		eUser.appendChild(eAge);
		//添加到root节点上
		root.appendChild(eUser);
		
		TransformerFactory tf=TransformerFactory.newInstance();
		Transformer tran=tf.newTransformer();
		tran.transform(new DOMSource(root), new StreamResult("./xml3/users.xml"));//root,document都行
	}

  • 删除---需求:删除最后一个元素
        public void delete() throws SAXException, IOException, ParserConfigurationException{
 		Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("./xml3/users.xml");//三合一的步骤
		Element root=(Element) document.getFirstChild();
		NodeList list=root.getElementsByTagName("user");
		Element user=(Element) list.item(list.getLength()-1);
		root.removeChild(user);
	}

  • 更新---把最后一个user的年龄+5
public void update() throws SAXException, IOException, ParserConfigurationException, TransformerException{
		Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("./xml3/users.xml");//三合一的步骤
		Element root=(Element) document.getFirstChild();
		NodeList list=root.getElementsByTagName("user");
		Element user=(Element) list.item(list.getLength()-1);
		Element eAge=((Element)user.getElementsByTagName("age").item(0));
		String age=eAge.getTextContent();
		int tempAge=Integer.parseInt(age)+5;
		eAge.setTextContent(""+tempAge);
		//root.replaceChild(newChild, oldChild)也可以这是替换
		
		//把内存中的当前dom对象存储到xml文件
		TransformerFactory tf=TransformerFactory.newInstance();
		Transformer tran=tf.newTransformer();
		tran.transform(new DOMSource(document), new StreamResult("./xml3/users.xml"));
	}

  • 这是遍历
public void query() throws ParserConfigurationException, SAXException, IOException{
		//第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbf对象
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		//第二步,通过dbf对象创建出一个DocumentBuilder对象
		DocumentBuilder db=dbf.newDocumentBuilder();
		//第三步,通过db对象创建出一个Document对象
		Document document=db.parse("./xml3/users.xml");
		Element root=(Element) document.getFirstChild();
		NodeList list=root.getElementsByTagName("user");
		for(int i=0;i<list.getLength();i++){
			Element user=(Element) list.item(i);
			String id=user.getAttribute("id");
			String name=user.getElementsByTagName("name").item(0).getTextContent();
			String age=user.getElementsByTagName("age").item(0).getTextContent();
			System.out.println("id:"+id+" name:"+name+ " age:"+age);
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值