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

来源:互联网 发布:java开发面试题及答案 编辑:程序博客网 时间:2024/05/21 21:34

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;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((id == null) ? 0 : id.hashCode());return result;}@Overridepublic 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");//获得DocumentDocument 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");// 设置idbookEle.setAttribute("id", "003");// 创建author元素Element authorEle = doc.createElement("author");// 给author设置值authorEle.setTextContent("强哥");// 创建title元素Element tieleEle = doc.createElement("title");// 给title设置值tieleEle.setTextContent("强哥威武");// 将author添加到bookbookEle.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是否为001if (id.equals("001")) {NodeList titleList = element.getElementsByTagName("title");// 获取唯一一个titleNode 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");// 获得DocumentDocument doc = builder.parse(in);return doc;}// 保存xmlprivate 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
原创粉丝点击