DOM解析xml文档

在java程序中如何获取xml文件的内容

一: 解析的目的    获取节点名,节点值,属性名,属性值

二:DOM方式解析的步骤(DOM需要读取整个的xml文档,然后在内存中创建DOM树,生成DOM树上的每个Node对象

        1):创建一个DocumentBuilderFactory的对象

    2):通过DocumentBuilderFactory的对象创建一个DocumentBuilder对象 -->DocumentBuilderFactory的对象.newDocumentBuilde();

       3):通过DocumentBuilder的parse方法来解析xml文件

public class DomTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建一个DocumentBuilderFactory的对象
		DocumentBuilderFactory dof=DocumentBuilderFactory.newInstance();
		//创建一个DocumentBUilder对象
		try {
			//通过DocumentBuilder对象的parse方法加载xml文件
			    DocumentBuilder db=dof.newDocumentBuilder();
				Document document=db.parse("books.xml");
				.....//解析文件
			} catch (SAXException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			}
		}
		
	}

这样准备工作就做完了,接下来就解析xml文件就好了 、

    常见的节点类型

节点类型 NodeType Named Constant nodeName的返回值 nodeValue的返回值
Element 1 ELEMENT_NODE element name null
Attr 2 ATTRIBUTE_NODE 属性名称 属性值
Text 3 TEXT_NODE #text 节点内容

常用的方法有: 

getElementsByTagName() 获取所有的节点,返回类型为NodeList
getLength() 返回NodeList中节点的个数
item(index) 获取一个节点,index表示索引,返回类型为Node
getAttributes() 获取节点中的属性,返回类型为NameNodeMap
getNodeName() 获取属性的名称
getNodeValue() 获取属性的值

完成代码为:

1): xml文件内容为:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
	<book id="1">
		<name>c语言</name>
		<year>2014</year>
		<price>89</price>
	</book>
	<book id="2">
		<name>数据结构</name>
		<year>2004</year>
		<price>89</price>
		<language>English</language>
	</book>
</bookstore>
2):测试类:
public class DomTest {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建一个DocumentBuilderFactory的对象
		DocumentBuilderFactory dof=DocumentBuilderFactory.newInstance();
		//创建一个DocumentBUilder对象
		try {
			//通过DocumentBuilder对象的parse方法加载xml文件
			    DocumentBuilder db=dof.newDocumentBuilder();
				Document document=db.parse("books.xml");
				//获取所有book节点的值
				NodeList bookList=document.getElementsByTagName("book");
				//通过nodelist的getLength()方法可以获取bookList的长度
				System.out.println("一共有"+bookList.getLength()+"本书");
				//遍历每一个book节点
				for(int i=0;i<bookList.getLength();i++){
					System.out.println("----下面开始遍历"+(i+1)+"个节点----");
					//通过item(i)方法,获取一个book节点,NodeList的索引值从0开始
					Node book=bookList.item(i);
					//获取book节点的所有属性集合
					NamedNodeMap nnp=book.getAttributes();
					System.out.println("第"+(i+1)+"本书共有"+nnp.getLength()+"个属性");
					//遍历book的属性
					for(int j=0;j<nnp.getLength();j++){
						//通过item(index)获取属性
						Node node=nnp.item(j);
						//获取属性名
						System.out.println("属性名:"+node.getNodeName());
						//获取属性值
						System.out.println("属性值为:"+node.getNodeValue());
					}
					//解析book节点的子结点
					NodeList childNodes=book.getChildNodes();
					//遍历每个子结点的节点名和节点值
					System.out.println("第"+(i+1)+"本书有"+childNodes.getLength()+"个子结点 (");
					for(int k=0;k<childNodes.getLength();k++){
						//获取具体子结点
						Node node=childNodes.item(k);
						//区分出text类型的node以及element类型的node
						if(node.getNodeType()==Node.ELEMENT_NODE){
							//获取element类型节点的节点名
							System.out.print("第"+(k+1)+"个节点值的名称为:"+node.getNodeName());
//							System.out.println("--节点值为:"+node.getFirstChild().getNodeValue());
							System.out.println("-->节点值为:"+node.getTextContent());
						}			
					}
					System.out.println(")");
				}
				
			} catch (SAXException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			}
		}
		
	}

DOM的优缺点:

    -优点:

        1):形成了树结构,直观好理解,代码易编写

        2):解析过程中书结构保存在内存中,方便修改

    -缺点

        当xml文件比较大时,对内存耗费比较大,容易影响解析性能并造成内存溢出



猜你喜欢

转载自blog.csdn.net/phoenix_tgd/article/details/79942885