XML DOC解析

<status_code>1234</status_code>中的1234本身也代表一个节点,只不过它是一个简单的TEXT节点
获取1234时也需要使用firstChild()方法来得到node节点
[employee: null]:Text节点


DOM介绍 优缺点分析

  DOM: Document Object Model 文档对象模型。


  在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序通过对这个对象模型的操作,来实现对XML文档数据的操作。


  通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。


  DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。


  然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或结构比较复杂时,对内存的需求就比较高。


  而且,对于结构复杂的树的遍历也是一项耗时的操作。


  所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。


  由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的应用价值的。


 


DOM的组成

  对于XML应用开发来说,DOM就是一个对象化的XML数据接口,一个与语言无关、与平台无关的标准接口规范。


  DOM定义了HTML文档和XML文档的逻辑结构,给出了一种访问和处理这两种文档的方法。


  文档代表的是数据,而DOM则代表了如何去处理这些数据。


  作为W3C的标准接口规范,目前,DOM由三部分组成,包括:核心(core)、HTML接口和XML接口。


  核心部分是结构化文档比较底层对象的集合,这一部分所定义的对象已经完全可以表达出任何HTML和XML文档中的数据了。


  HTML接口和XML接口两部分则是专为操作具体HTML文档和XML文档所提供的高级接口。


 


DOM树

  一个XML文档及其所对应的DOM树如下:
<?xml version="1.0" encoding="UTF-8"?>
<disks>
    <disk id="C"  type ="windows">
        test
        <size>10G+</size>
         <size>10G</size>
        <directory>10</directory>
        <file>20</file>
    </disk>
     <disk id="D">
        <size>20G</size>
        <directory>40</directory>
        <file>60</file>
    </disk>
</disks>



  要严格区分XML文档树中的根节点与根元素节点:


  文档(根节点)和根元素节点是两回事。


  根节点代表整个文档,是我们解析XML文档的入口,通过它获取到Document对象;


  根元素节点代表XML文档的根元素,必须要在获得Document对象之后才能一层一层地去访问它的元素。


 


DOM模型结构

  最常见的节点类型:


  元素:元素是XML的基本构建。


  元素可以有其他元素、文本节点或两者兼有来作为其子节点。


  元素节点还是可以有属性的唯一类型的节点。


  属性:属性节点包含关于元素节点的信息,但实际上,不认为它是元素的子节点。


  文本:确切来讲,文本节点是文本。它可以包含许多信息或仅仅是空白。


  文档(根节点) :文档节点是整个文档中所有其他节点的父节点。(根节点不等于根元素节点)。


  较不常见的节点类型:CDATA、注释、处理指令。


 


DOM的四个基本接口

  在DOM接口规范中,有四个基本的接口:Document, Node, NodeList, NamedNodeMap。


Document
  Document接口是对文档进行操作的入口,它是从Node接口继承过来的。 


Node
  Node接口是其他大多数接口的父类。


  在DOM树中,Node接口代表了树中的一个节点。


NodeList
  NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。


  它提供了对节点集合的抽象定义,并不包含如何实现这个节点集的定义。


  NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。


  在DOM中,NodeList的对象是live的,对文档的改变,会直接反映到相关的NodeList对象中。


public class DiskDon {

	public static void main(String[] args) {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			File file = new File("src/com/xm/disk.xml");
		
			Document doc = builder.parse(file);
			NodeList list  =doc.getElementsByTagName("disk"); //这里可能有很多个disk ,所以取数组
			
			
			System.out.println(doc.getElementsByTagName("disk").item(0).getFirstChild().getNodeValue());
			for (int i = 0; i < list.getLength(); i++) {
				//Element 是Node 的实现类
				Element e = (Element) list.item(i);
				String id = e.getAttribute("id");
				//这里可能有很多个size ,但我们默认只取第一个size节点的包括的数据
				String size = doc.getElementsByTagName("size").item(i).getFirstChild().getNodeValue();
				String fiel = doc.getElementsByTagName("file").item(i).getFirstChild().getNodeValue();
				System.out.println(id+size+fiel);
			}
			
			System.out.println(list.item(0).getAttributes().item(1).getNodeValue());
			System.out.println(list.item(0).getAttributes().item(0).getNodeValue());

			 System.out.println(list.item(0).getChildNodes().item(1).getNodeType());
			 System.out.println(list.item(0).getChildNodes().item(1).getFirstChild().getNodeValue());
			 System.out.println(list.item(0).getChildNodes().item(1).getParentNode().getNodeValue());
			
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<disks>
    <disk id="C"  type ="windows">
        test
        <size>10G+</size>
         <size>10G</size>
        <directory>10</directory>
        <file>20</file>
    </disk>
     <disk id="D">
        <size>20G</size>
        <directory>40</directory>
        <file>60</file>
    </disk>
</disks>





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值