XML系列:(4)XML解析-JAXP的DOM解析方式读取XML

DOM、SAX和StAX只是解析方式,没有API。

JAXP是SUN提供的一套XML解析API。
   JAXP(Java API for XMLProcessing,意为XML处理的Java API)

JAXP很好的支持DOM和SAX解析。

JAXP开发包是JAVASE的一部分,它由java.xml、org.w3c.dom、org.xml.sax包及其子包组成

products.mxl

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE products[
   <!ELEMENT products (product+)>
   <!ELEMENT product (name,price)>
   <!ELEMENT name (#PCDATA)>
   <!ELEMENT price (#PCDATA)>
   <!ATTLIST product id ID #REQUIRED>
]>
<products>
   <product id="p001">
      <name>往事并不如烟</name>
      <price>49.9元</price>
   </product>
      <product id="p002">
      <name>围城</name>
      <price>59.9元</price>
   </product>
</products>

1、以DOM解析方式读取XML

1.1、根据Id读取一个元素(Element)

package com.rk.xml.d_jaxp_dom;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * 根据Id读取一个元素(Element)
 * 通过Document.getElementById(String elementId)方法获取一个元素(Element)
 * @author RK
 *
 */
public class Demo01
{
	public static void main(String[] args) throws Exception
	{
		//1、新拿到解析器工厂
		//2、通过解析器工厂拿到解析器对象
		//3、通过解析器对象解析XML文档,并返回Document对象
		//4、通过Document对象去获取节点Node

		//1、新拿到解析器工厂
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		//2、通过解析器工厂拿到解析器对象
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		//3、通过解析器对象解析XML文档,并返回Document对象
		Document doc = builder.parse("./src/products.xml");
		//4、通过Document对象去获取节点Node
		Element elem = doc.getElementById("p001");//必须使用DTD声明ID属性
		System.out.println(elem);//[product: null]
		System.out.println(elem.getNodeType());//1		元素(Element)类型的节点用1表示
		System.out.println(elem.getNodeName());//product
		System.out.println(elem.getNodeValue());//null
		System.out.println(elem.getTextContent());//往事并不如烟49.9元
	}
}

1.2、读取一系列节点(NodeList)

package com.rk.xml.d_jaxp_dom;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;

/**
 * 读取一系列节点(NodeList)
 * 通过Document.getElementsByTagName(String tagname)获取一系列节点。
 * @author RK
 *
 */
public class Demo02
{
	public static void main(String[] args) throws Exception
	{
		//1、新拿到解析器工厂
		//2、通过解析器工厂拿到解析器对象
		//3、通过解析器对象解析XML文档,并返回Document对象
		//4、通过Document对象去获取节点Node

		//1、新拿到解析器工厂
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		//2、通过解析器工厂拿到解析器对象
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		//3、通过解析器对象解析XML文档,并返回Document对象
		Document doc = builder.parse("./src/products.xml");
		//4、通过Document对象去获取节点Node
		NodeList list = doc.getElementsByTagName("product");

		System.out.println("找到"+list.getLength()+"个");//找到多少个节点

		for(int i=0;i<list.getLength();i++)
		{
			Node node = list.item(i);
			System.out.println(node);//将各个节点进行打印
		}
	}

}

1.3、读取一个属性(Attribute)

package com.rk.xml.d_jaxp_dom;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.NamedNodeMap;

/**
 * 读取一个属性(Attribute)
 * @author RK
 *
 */
public class Demo03
{
	public static void main(String[] args) throws Exception
	{
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		Document doc = builder.parse("./src/products.xml");
		NodeList list = doc.getElementsByTagName("product");
		Node node = list.item(0);
		NamedNodeMap map =  node.getAttributes();//获取到所有属性类型的节点
		Node attrNode = map.getNamedItem("id");//获取到属性为“id”的节点
		System.out.println(attrNode.getNodeType());//2 	属性(Attribute)类型的节点用2表示
		System.out.println(attrNode.getNodeName());//id
		System.out.println(attrNode.getNodeValue());//p001
		System.out.println(attrNode.getTextContent());//p001
	}
}

1.4、读取一个元素的文本(Text)

package com.rk.xml.d_jaxp_dom;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;

/**
 * 读取一个元素的文本(Text)
 * @author RK
 *
 */
public class Demo04
{
	public static void main(String[] args) throws Exception
	{
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		Document doc = builder.parse("./src/products.xml");
		NodeList list = doc.getElementsByTagName("name");
		Node node = list.item(0);
		System.out.println(node.getTextContent());//往事并不如烟
	}

}

1.5、遍历Document对象树

package com.rk.xml.d_jaxp_dom;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.NamedNodeMap;

/**
 * 遍历所有节点
 * @author RK
 *
 */
public class Demo05
{
	public static void main(String[] args) throws Exception
	{
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		Document doc = builder.parse("./src/products.xml");
		StringBuilder sb = new StringBuilder();

		NodeList childNodes = doc.getChildNodes();
		for(int i=0;i<childNodes.getLength();i++)
		{
			Node node = childNodes.item(i);
			System.out.println(node.getNodeType() + "===" + node.getNodeName()+ "===" + node.getNodeValue());
		}
		/*
		输出结果:
		10===products===null				DOCUMENT_TYPE_NODE        = 10
		1===products===null 				ELEMENT_NODE              = 1

		 */

		traverseDocument(doc.getLastChild(),sb);
		System.out.println(sb.toString());

		/*
 		输出结果:
		 <products >
			<product id="p001" >
				<name >往事并不如烟</name>
				<price >49.9元</price>
			</product>
				<product id="p002" >
				<name >围城</name>
				<price >59.9元</price>
			</product>
		</products>
		 */
	}

	private static void traverseDocument(Node node, StringBuilder sb)
	{
		//1、当前元素开始
		sb.append("<" + node.getNodeName() + " ");
		//2、获取属性

		if(node.hasAttributes())
		{
			NamedNodeMap nodeMap = node.getAttributes();
			for(int i=0;i<nodeMap.getLength();i++)
			{
				Node attrNode = nodeMap.item(i);
				sb.append(attrNode.getNodeName() + "=\"" + attrNode.getNodeValue() + "\" ");
			}
		}
		sb.append(">");

		//3、获取子节点
		NodeList childNodes = node.getChildNodes();
		for(int i=0;i<childNodes.getLength();i++)
		{
			Node subNode = childNodes.item(i);
			short type = subNode.getNodeType();
			if(type == 1)//当前节点是Element节点
			{
				traverseDocument(subNode, sb);
			}
			else if(type == 3)//当前节点是Text节点
			{
				sb.append(subNode.getTextContent());
			}
			else
			{
				//其它情况,不做处理
			}
		}

		//4、当前元素结束
		sb.append("</" + node.getNodeName() + ">");
	}
}

2、思维导图

时间: 2024-07-30 10:07:25

XML系列:(4)XML解析-JAXP的DOM解析方式读取XML的相关文章

xml解析-jaxp之dom解析

package day06_parser.dom; /** * xml的解析技术:JAXP是Java API for XML Processing的英文字头缩写, * 中文含义是:用于XML文档处理的使用Java语言编写的编程接口.JAXP支持DOM.SAX.XSLT等标准. * 下面我们研究两种解析方式: * 1.dom解析 2.sax解析:Simple API for XML * 下面是dom解析的实例. * JAXP-DOM解析实例: * 下面的实例实现的功能是,通过javax.xml包实

XML系列:(5)XML解析-JAXP的DOM解析方式修改XML

DOM.SAX和StAX只是解析方式,没有API. JAXP是SUN提供的一套XML解析API.JAXP(Java API for XMLProcessing,意为XML处理的Java API) JAXP很好的支持DOM和SAX解析. JAXP开发包是JAVASE的一部分,它由java.xml.org.w3c.dom.org.xml.sax包及其子包组成 1.以DOM解析方式修改XML 1.1.将Document树保存到文件中 package com.rk.xml.e_jaxp_dom_writ

JAXP进行DOM解析的实践

比较重要的几个类,使用频率比较高的就是Document, Element与Node. 几个常用的套路: static { try { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); builder = dbFactory.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } }

Java学习之道:使用JAXP进行DOM解析( DocumentBuilderFactory、DocumentBuilder、Document)

1.javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回 2.调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂. 3.调用工厂对象的 newDocumentBuilder

通过w3c方式 读取xml内容

/** * 通过w3c方式 读取xml内容 * @param lablenames 要读取的节点名称 * @param file_path_name 文件绝对路径 * @return */ public static WebMagic readXML(List<String> lablenames, String file_path_name) { WebMagic webMagic = new WebMagic(); try { DocumentBuilderFactory factory

XML系列:(6)XML解析-Dom4j的DOM解析方式读取XML

Dom4j工具,是非官方的,不在jdk中. 使用步骤: 1)导入dom4j的核心包. dom4j-1.6.1.jar 2)编写Dom4j读取xml文件的代码 animals.xml <?xml version="1.0" encoding="UTF-8"?> <Animals> <Cat id="c001" name="喵喵"> <Home>火星</Home> <

XML系列:(7)XML解析-Dom4j的DOM解析方式更新XML

Dom4j工具,是非官方的,不在jdk中. 使用步骤: 1)导入dom4j的核心包. dom4j-1.6.1.jar 2)编写Dom4j读取xml文件的代码 1.更新XML 1.1.写出内容到xml文档 package com.rk.xml.g_dom4j_write; import java.io.File; import java.io.FileOutputStream; import org.dom4j.Document; import org.dom4j.io.SAXReader; im

[ java 工具类] xml字符串解析成Map(DOM解析)

package com.tencent.jungle.wechat.util; import com.google.inject.Singleton; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.

DOM与SAX读取XML方式的不同

操作XML有两种主要方法:DOM和SAX.DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点.SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件. 1. DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中.从而消耗很大的内存空间.而SAX是基于事件的.当某个事件被触发时,才获取相应的XML的部分数据,从而不管XML文件有多大,都只占用了少量的内存空间. 2. DOM可以读取XML也可以向XML文件中插入数据,而SA