【XML编程】 XML编程第一天

-----------------------------------------------------------------------------------------------------面试题 ST--------------------------------------------------------------------------------------------------------------

(1.)Dom解析和sax的区别:

DOM: 增删改查方便,内存消耗比较大(全部加载进内存再解析)

SAX: 内存消耗小,适合做读取。不适合对做增删改查 (一行一行解析)

(2.)

调整jvm内存大小:

Application -- > Run as| Run configures --> VM arguments -Xmx80m

-----------------------------------------------------------------------------------------------------面试题 END--------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------基础知识 ST--------------------------------------------------------------------------------------------------------------

XML: Extensible Markup Language 可扩展标记语言

XML语法:

1.      文档声明

2.      元素

3.      属性

4.      注释

5.      CDATA区 , 特殊字符

6.      处理指令(processinginstruction)

例:

<bookstore>
<book category="COOKING">
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author> 
  <year>2005</year> 
  <price>30.00</price> 
</book>
<book category="CHILDREN">
  <title lang="en">Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book>
<book category="WEB">
  <title lang="en">Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price>39.95</price> 
</book>
</bookstore>


在 XML 中,一些字符拥有特殊的意义。

如果你把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。

&lt;<小于
&gt;>大于
&amp;&和号
&apos;'单引号
&quot;"引号

声明:

防止出现全角空格(会提示无法显示xml页)(可以被浏览器正常打开)

<?xml version="1.0"encoding="UTF-8"?>
<note>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget themeeting!</body>
</note>

元素:

xml文件中出现的标签

包含标签体:<a>world</a>

不包含标签体:<a></a> 可简写成<a/>                   空格和换行会被当作原始内容被解析


命名规范:

XML 命名规则(可使用任何名称,没有保留的字词。)

XML 元素必须遵循以下命名规则:

1.名称可以含字母、数字以及其他的字符

2.名称不能以数字或者标点符号开始

3.名称不能以字符 “xml”(或者 XML、Xml)开始

4.名称不能包含空格


注释:

<!-- content -->

CDATA区:

有些内容不想让解析引擎解析,直接放在CDATA区原封不动的输出

语法:<![CDATA[内容]]>

  <![CDATA[

    <a>

      <b></b>

    </a>

  ]]>

处理指令:

简称PI,用来只会解析引擎如何解析XML文档内容

XML约束:

编写一个文档来约束其他xml文件的书写规则

 

常见的约束技术:(1.)XML DTD (2.)XML Schema  

XML解析方式: dom和sax

Dom:文档对象模型

Sax:simple API for XML


主要关注JAXP和 dom4j解析

JAXP 开发包:

由javax.xml,org.w3c.dom,org.xml.sax 及其子包组成

 

在javax.xml.parse包中,定义了几个工厂类,调用这些工厂类,可以得到xml文档的DOM或者SAX的解析器,从而实现对xml文档的解析

DOM解析下,xml文档的每一个组成部分都会用一个对象表示,例如标签用Element,属性用Attr,但不管什么对象,都是Node的子类,所以在开发中可以把获取到的任意节点都当作Node对待。

-------------------------------------------------------------------------------------------------基础知识END----------------------------------------------------------------------------------------------------------


---------------------------------------------------------------------------------------------编程ST-----------------------------------------------------------------------------------------------------


文中操作的xml文档为如下:book.xml
 <?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
  <书架>
  <书>
  <书名 name="think in java">Think in Java</书名> 
  <作者>张柬</作者> 
  <售价>45.08元</售价> 
  <售价>109元</售价> 
  <售价>45.08元</售价> 
  </书>
  <书>
  <书名>javascript 开发</书名> 
  <作者>张柬之</作者> 
  <售价>23.9元</售价> 
  </书>
  </书架>
示例1:

获得文档标签中的内容:

// 获得文档标签中的内容
	@Test
	public void read1() throws Exception {
		// 1.创建工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 2.得到DOM解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 3.解析xml文档,得到代表文档的document
		Document document = builder.parse("src/book.xml");

		NodeList nl = document.getElementsByTagName("书名");

		Node node = nl.item(1);

		String content = node.getTextContent();

		System.out.println(content);
	}
示例2:

递归 遍历出所有节点:

// 递归 遍历出所有节点
	@Test
	public void read2() throws Exception {
		// 1.创建工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 2.得到DOM解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 3.解析xml文档,得到代表文档的document
		Document document = builder.parse("src/book.xml");

		// 得到根节点
		Node root = document.getElementsByTagName("书架").item(0);

		list(root);
	}

	private void list(Node node) {
		// 输出节点名称
		System.out.println(node.getNodeName());
		NodeList list = node.getChildNodes();

		for (int i = 0; i < list.getLength(); i++) {
			Node child = list.item(i);
			list(child);
		}
	}

示例3:

得到xml文档中标签属性的值:

// 得到xml文档中标签属性的值
	@Test
	public void read3() throws Exception {
		// 1.创建工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 2.得到DOM解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 3.解析xml文档,得到代表文档的document
		Document document = builder.parse("src/book.xml");

		// Node node=document.getElementsByTagName("书名").item(0);
		// Node中的方法无法依据属性标签得到name,强转成Element

		Element element = (Element) document.getElementsByTagName("书名").item(0);

		String name = element.getAttribute("name");
		System.out.println(name);
	}

示例4:

如何往XML文档中添加数据:

// 如何往XML文档中添加数据
	@Test
	public void add() throws Exception {
		// 创建工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 得到DOM解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 解析XML文档,得到代表文档的document
		Document document = builder.parse("src/book.xml");

		// 创建一个节点
		Element price = document.createElement("售价");
		price.setTextContent("45.08元");

		// 把创建的节点挂到第一本书上
		Element book = (Element) document.getElementsByTagName("书").item(0);

		book.appendChild(price);

		// 把更新后内存中的数据添加到xml文档中
		// 构建TransformerFactory工厂
		TransformerFactory tffactory = TransformerFactory.newInstance();
		// 得到转换器
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(
				new FileOutputStream("src/book.xml")));
	}
示例5:

如何往XML文档中指定位置添加数据:

// 如何往XML文档中指定位置添加数据
	@Test
	public void add2() throws Exception {
		// 创建工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 得到DOM解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 解析XML文档,得到代表文档的document
		Document document = builder.parse("src/book.xml");
		
		// 创建一个节点
		Element price = document.createElement("售价");
		price.setTextContent("45.08元");
		
		//得到参考节点
		Element refNode=(Element) document.getElementsByTagName("售价").item(0);
		
		// 得到要挂载的节点
		Element book = (Element) document.getElementsByTagName("书").item(0);
		
		//往book节点的指定位置插入
		book.insertBefore(price, refNode);
		
		// 把更新后内存中的数据添加到xml文档中
		// 构建TransformerFactory工厂
		TransformerFactory tffactory = TransformerFactory.newInstance();
		// 得到转换器
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(
				new FileOutputStream("src/book.xml")));
	}

---------------------------------------------------------------------------------------------编程END-----------------------------------------------------------------------------------------------------









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值