XML语法以及书写规范,Jaxp Dom解析XML

1.XML语法

1.1XML元素书写的规范

XML必须有且仅有一个根标签,其他标签都是这个根标签的子标签。
  • 区分大小写,例如,<P>和<p>是两个不同的标记。
  • 不能以数字或“_”(下划线)开头。
  • 不能以xml(或XML、或Xml)等开头。
  • 不能包含空格。
  • 名称中间不能包含冒号(:)

1.2CDTAT区

在编写XML文件是,如果希望将一些特殊字符(如<br/>)显示出来,可以使用CDTAT语法,CDTAT区的语法如下:
	<![CDTAT[内容]]>

1.3转义字符

对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以出来,常见如下:
	特殊字符				替代符号
	&					&amp
	<					&lt
	>					&gt
	"					&quot
	.					&apos
1.4XML语法规则总总结
  • 所有XML元素都须有关闭标签
  • XML标签对大小写敏感
  • XML必须正确的嵌套顺序
  • XML文档必须有根元素
  • XML的属性值需加引号
  • 特殊字符必须转义
  • XML中的空格会被保留

2.用Java处理XML

即Java程序对XML文档进行解析,XML解析方式一般分为两种:
  • dom:(Document Object Model,即文档对象模型)是W3C组织推荐的解析XML的一种方式
  • sax:(Simple API for XML)不是官方标准,但他是XML社区事实上的标准,几乎所有的XML解析器都支持它
常见的XML解析包有以下几种:Jaxp(sun)、Jdom、dom4、pill(android的sdk自带)
node和element的区别  此段摘抄于点击打开链接
1、通过继承关系XmlElement继承自XmlLinkedNode又继承自XmlNode类,由此可知XmlElement是XmlNode的子类。我们知道子类继承了父类所有的属性和方法,因此,XmlNode所拥有的方法和属性,在XmlElement类中也是可以使用的。
2、XmlElement是特殊的XmlNode类,Xml节点有多种类型:属性节点、注释节点、文本节点、元素节点等。也就是XmlNode是这多种节点的统称。但是XmlElement专门指的就是元素节点。
3、XmlElement是具现类,可以直接实例化,而XmlNode是抽象类,必须通过XmlDocument实例通过CreateNode创建。
4、XmlElement拥有众多对Attribute的操作方法,可以方便的对其属性进行读写操作(XmlNode也可以通过Attributes属性获取属性列表)。
5、在网上看到有人这么评论这两个类的区别:XmlNode包含子节点,XmlElement只包含属性及其本身不含有子节点。但是我通过代码测试,发现即使是XmlElement,也可以通过ChildNodes来获取子节点列表。虽然在断点中断模式下,我并没有发现XmlElement有ChildNodes属性。举例如下:
<Book img="aspnet.jpg"> //是XmlNode也是XmlElement,但是img以及aspnet.jpg只是XmlNode
      <Name> //既是XmlNode 也是XmlElement   
          C#      //只是XmlNode   
      </Name>  
</Book>
也就是元素节点可以相应转换为XmlElement,这样既可以使用XmlNode的功能,也可以使用它特有的对属性的操作方法。
任意节点都可以使用XmlNode,因为XmlNode是所有Node的父类。

2.1Jaxp Dom解析XML

JAXP是Sun提供的一套XML解析API,很好的支持DOM和SAX解析方式,JAXP开发包是J2SE的一部分,包括Javax.xml、org.w3c.dom、org.xml.sax的包或子包。
步骤:
	1.获得解析工厂类DocumentBuilderFactory的实例
	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	2.获得解析器DocumentBuilder的实例
	DocumentBuilder db = dbf.newDocumentBuilder();
	3.解析生成Document对象
	Document doc = db.parse("book.xml");//此文件在项目的根目录中
	4.通过Document对象查询节点
		通过document.getElementByTagName方法返回NodeList对象,节点列表类NodeList代表了一个包含一个或多个Npde的列表,可以简单的把它看成一个Node数组

NodeList常见方法:1.getLength()——返回列表的长度,2.item(int)——返回指定位置的Node对象
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
	<book id="001">
		<author>张三</author>
		<title>张三传</title>
		<year>2012</year>
		<price>88</price>
	</book>
	<book id="002">
		<author>红梅大侠</author>
		<title>百变武侠</title>
		<year>2012</year>
		<price>29.99</price>
	</book>
	<book1 id="002">
		<author>红梅大侠</author>
		<title>百变武侠</title>
		<year>2012</year>
		<price>29.99</price>
	</book1>
</bookstore>
/**
 * 将XMl中的元素封装成Bool类
 * 2017-4-10 23:29:42
 */
public class Book {
	private String id;
	private String title;
	private String author;
	private String year;
	private Double price;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getYear() {
		return year;
	}
	public void setYear(String year) {
		this.year = year;
	}
	public Double getPrice() {
		return price;
	}
	public void setPrice(Double price) {
		this.price = price;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Book other = (Book) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
	
}
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * 采用Dom读取books.xml 2017-4-10 23:30:41
 */
public class JaxpDomReader {
	public static void main(String[] args) throws ParserConfigurationException,
			SAXException, IOException {
		Set<Book> books = getAllBook();
		for (Book book : books) {
			System.out.println("[id=" + book.getId() + ",author="
					+ book.getAuthor() + ",title=" + book.getTitle() + ",year="
					+ book.getYear() + ",price=" + book.getPrice());
		}
	}

	private static Set<Book> getAllBook() throws ParserConfigurationException,
			SAXException, IOException {
		// 获得工厂实例
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 获得解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 获得src下面的book.xml中的文件
		InputStream in = Book.class.getClassLoader().getResourceAsStream(
				"books.xml");
		// 获得文档
		Document document = builder.parse(in);
		// 获得所有元素,名称叫book的元素
		NodeList bookElements = document.getElementsByTagName("book");// Elements元素,基础,原理,
		// 获得所有元素的大小
		int size = bookElements.getLength();// 2
		// 保存所有Book对象
		Set<Book> books = new HashSet<Book>();
		// 遍历所有元素
		for (int i = 0; i < size; i++) {
			// 获取书籍元素
			Node node = bookElements.item(i);
			// 转换成Element
			/*
			 * lement 接口表示 HTML 或 XML 文档中的一个元素。元素可能有与它们相关的属性;由于 Element 接口继承自
			 * Node,所以可以使用一般 Node 接口属性 attributes 来获得元素所有属性的集合。Element
			 * 接口上有通过名称获得 Attr 对象或通过名称获得属性值的方法。在 XML 中(其中的属性值可能包含实体引用),应该获得 Attr
			 * 对象来检查表示属性值的可能相当复杂的子树。另一方面,在 HTML
			 * 中(其中的所有属性都有简单的字符串值),可以使用直接访问属性值的方法,这既安全又便捷。
			 */
			Element element = (Element) node;
			// 获取ID属性,获取元素的属性值
			String id = element.getAttribute("id");
			Book book = new Book();
			book.setId(id);
			// 获得所有孩子,所有子节点
			NodeList childList = element.getChildNodes();
			// 获得所有孩子大小
			int c = childList.getLength();
			// 遍历所有孩子
			for (int j = 0; j < c; j++) {
				Node childNode = childList.item(j);
				String childName = childNode.getNodeName();// 获取节点元素名称
				String val = childNode.getTextContent();// 元素包含内容
				if ("author".equals(childName)) {
					book.setAuthor(val);
				}
				if ("title".equals(childName)) {
					book.setTitle(val);
				}
				if ("year".equals(childName)) {
					book.setYear(val);
				}
				if ("price".equals(childName)) {
					book.setPrice(Double.parseDouble(val));
				}
			}
			books.add(book);
		}
		return books;
	}
}

2.2JAXP Dom保存XML

	Jaxp Dom可以将内存中的XML文档保存到硬盘中
	1.获得TransformerFactory持久化对象工厂实例。
		TransformerFactory factory = TransformerFactory.newInstance();
	2.获得Transformer持久化对象
		Transformer former = factory.newTransformer();
	3.将Document封装到Source中
		Source xmlSource = new DOMSource(doc);
	4.将文件路径封装都Result中
		Result outputTarget = new StreamResult("books.temp.xml");
	5.调用Transformer持久化对象的transform方法进行保存
		former.transform(xmlSource, outputTarget);
import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class JaxpDomWriter {
	public static void main(String[] args) throws TransformerException, ParserConfigurationException, SAXException, IOException {
		Document doc = getDocument();
		//获得持久化对象工厂实例
		TransformerFactory factory = TransformerFactory.newInstance();
		//获得持久化对象
		Transformer former = factory.newTransformer();
		//源文件:将document封装到Source中
		Source xmlSource = new DOMSource(doc);
		//将文件路径封装到Result中
		Result outputTarget = new StreamResult("books.temp.xml");
		former.transform(xmlSource, outputTarget);
		
	}
	private static Document getDocument() throws ParserConfigurationException, SAXException, IOException{
		//获得工厂实例
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		//获得解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		InputStream in = JaxpDomWriter.class.getClassLoader().getResourceAsStream("books.xml");
		//获得Document
		Document doc = builder.parse(in);
		return doc;
	}
}

2.3Jaxp Dom修改xml和---删除节点node---向xml添加元素节点

import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Jaxp Dom 修改xml 2017-4-11 15:09:26
 * 
 */
public class JaxpDomUpdate {

	public static void main(String[] args) throws Exception {
		addElement();//xml中添加元素节点
//		updateAndDelete();// 修改xml和删除节点
	}

	// 增加元素
	private static void addElement() throws Exception {
		Document doc = getDocument();
		// 获得根元素
		Element element = doc.getDocumentElement();
		// 创建book元素
		Element bookEle = doc.createElement("book2");
		// 设置id
		bookEle.setAttribute("id", "003");
		// 创建author元素
		Element authorEle = doc.createElement("author");
		// 给author设置值
		authorEle.setTextContent("强哥");
		// 创建title元素
		Element tieleEle = doc.createElement("title");
		// 给title设置值
		tieleEle.setTextContent("强哥威武");
		// 将author添加到book
		bookEle.appendChild(authorEle);
		bookEle.appendChild(tieleEle);
		//将book添加到根元素
		element.appendChild(bookEle);
		saveDocment(doc);
	}

	// 修改xml和删除节点
	private static void updateAndDelete() throws Exception {
		Document doc = getDocument();
		// 获取所有名称为book的节点元素
		NodeList nodeList = doc.getElementsByTagName("book");
		// 获取节点元素的个数
		int leng = nodeList.getLength();
		for (int i = 0; i < leng; i++) {
			// 获得book元素
			Element element = (Element) nodeList.item(i);
			// 获取id的值
			String id = element.getAttribute("id");
			// 判断id是否为001
			if (id.equals("001")) {
				NodeList titleList = element.getElementsByTagName("title");
				// 获取唯一一个title
				Node title = titleList.item(0);
				// 修改title的值
				title.setTextContent("天下第一");
			}
			// 删除id为002的节点
			if (id.equals("002")) {
				// 得到父节点
				Node parent = element.getParentNode();
				// 删除
				parent.removeChild(element);
			}
		}
		saveDocment(doc);
	}

	// 获得Document对象
	private static Document getDocument() throws Exception {
		// 获得工程实例
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 获得解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		InputStream in = JaxpDomUpdate.class.getClassLoader()
				.getResourceAsStream("books.xml");
		// 获得Document
		Document doc = builder.parse(in);
		return doc;
	}

	// 保存xml
	private static void saveDocment(Document doc) throws Exception {
		// 获得持久化对象工厂实例
		TransformerFactory factory = TransformerFactory.newInstance();
		// 获得持久化
		Transformer transformer = factory.newTransformer();
		// 源文件:将document封装到Source中
		Source xmlSource = new DOMSource(doc);
		// 将文件路径封装到Result中
		Result outputTarget = new StreamResult("books.temp.xml");
		transformer.transform(xmlSource, outputTarget);// xml来源,输出目标
	}
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值