1.XML语法
1.1XML元素书写的规范
XML必须有且仅有一个根标签,其他标签都是这个根标签的子标签。
- 区分大小写,例如,<P>和<p>是两个不同的标记。
- 不能以数字或“_”(下划线)开头。
- 不能以xml(或XML、或Xml)等开头。
- 不能包含空格。
- 名称中间不能包含冒号(:)
1.2CDTAT区
在编写XML文件是,如果希望将一些特殊字符(如<br/>)显示出来,可以使用CDTAT语法,CDTAT区的语法如下:
<![CDTAT[内容]]>
1.3转义字符
对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以出来,常见如下:
特殊字符 替代符号 & & < < > > " " . &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来源,输出目标
}
}