XML解析器是指可以解析XML文件的程序
常见解析器有
1. SAX解析器,用于XML的简单API
2. DOM解析器,文档对象模型
文档对象模型就是利用对象来把文档模型化,这些模型不仅描述了文档的结构,还定义了模型中对象的行为。在DOM中,对象模型要实现:
a. 用来表示、操作文档的接口
b. 接口的行为和属性
c. 接口之间的关系和互操作。
在DOM接口规范中,有四个最基本的接口:Document,Node,NodeList,以及NamedNodeMap.
其中:一切都是节点(对象)
Node对象:DOM中最基本的对象
Document对象:代表整个XML文档
NodeList对象包含一个或者是多个Node的列表
Element对象代表xml文档中的标签元素
l 如何读取xml文件?
1.建立一个解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2.以利用这个工厂来获得一个具体的解析器对象
DocumentBuilder builder= factory.newDocumentBuilder();
3. 利用DocumentBuilder中的parse()方法接收一个xml文档名作为输入参数,返回一个Document对象。Document对象代表了一个XML文档的树模型
Document doc = builder.parse(“book.xml”)
4. 使用Document对象的getElementByTagName()方法,得到一个NodeList对象,它是XML文档中的标签元素列表,可以使用NodeList对象的item()方法得到列表中每个Node对象
NodeList nodelist = doc.getElementsByTagName(“book”);
Element node =(Element) nodelist.item(i);
5. 通过Node对象的getNodeValue()方法提取某个标签内的内容
Node.getElementsByTagName(“name”).item(0).getFirstChild().getNodeValue();
l 利用DOM,如何创建一个xml文件?
//创建一个解析器工厂对象
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
//创建一个具体的解析器对象
DocumentBuilder builder =factory.newDocumentBuilder();
//创建一个document文档对象
Document document = builder.newDocument();
Element root =document.createElement("books");
Element book =document.createElement("book");
Element bname =document.createElement("bname");
bname.setTextContent("梦想");
Element author =document.createElement("author");
author.setTextContent("小");
Element price =document.createElement("price");
price.setTextContent("30");
Attr id =document.createAttribute("id");
id.setValue("book_001");
book.setAttributeNode(id);
root.appendChild(book);
book.appendChild(bname);
book.appendChild(author);
book.appendChild(price);
document.appendChild(root);
//创建xml文件转换器
TransformerFactory transfactory =TransformerFactory.newInstance();
Transformer transformer =transfactory.newTransformer();
//设置输出编码
transformer.setOutputProperty("encoding","utf-8");
//定义转换器输入对象
DOMSource source = new DOMSource(document);
//定义转换器输出对象
Result target = newStreamResult("books.xml");
transformer.transform(source, target);