一.动态生成XML
1.使用Document动态生产XML
创建Document
1.实例化Document工厂:DocumentBuilderFactory
2.实例化Document构造器:DocumentBuilder
3.实例化Document:Document
4.创建标签:document.createElement();
5.创建属性:document.createAttribute();
6.建立关系:appendChild();
将Document保存到本地XML中
1.实例化转换器工厂:TransFormerFactory
2.实例化转化器:Transformer
3.设置来源:Source:DOMSource
4.设置目的地:Result:StreamResult
5.转换:transform();
代码实现
/**
* 创建XML 使用Document
* @author Cookie
*
*/
public class TestCreateXMlByDocument {
public static void main(String[] args) {
try {
//1.实例化DocumentBuilderFactory
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//2.通过dbf获取DocumentBuilder
DocumentBuilder db=dbf.newDocumentBuilder();
//3.创建Document
Document document=db.newDocument();
//4.创建标签<persons>
Element elementPersons=document.createElement("persons");
//创建<person>
Element elementPerson=document.createElement("person");
//创建<page>
Element elementPage=document.createElement("page");
//给标签设值
elementPage.setTextContent("22");
//创建<psex>
Element elementPsex=document.createElement("psex");
elementPsex.setTextContent("男");
//5.创建属性
Attr attrPid=document.createAttribute("pid");
//给属性设值
attrPid.setValue("1");
Attr attrPname=document.createAttribute("pname");
attrPname.setValue("hug");
//6.建立关系
document.appendChild(elementPersons);
elementPersons.appendChild(elementPerson);
elementPerson.appendChild(elementPage);
elementPerson.appendChild(elementPsex);
elementPerson.setAttributeNode(attrPid);
elementPerson.setAttributeNode(attrPname);
System.out.println("创建OK");
//将生成的Document保存到XML文件中
//1.实例化转换器工厂
TransformerFactory tff=TransformerFactory.newInstance();
//2.通过tff获取转换器
Transformer transformer=tff.newTransformer();
//来源
DOMSource source=new DOMSource(document);
//结果
StreamResult streamResult=new StreamResult(new File("my.xml"));
//3.开始转换
transformer.transform(source, streamResult);
System.out.println("保存成功");
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
}
2.dom4j
创建Document
1.使用DocumentHelper创建Document
2.添加标签:addElement(“标签名”);
3.添加属性:addAttribute(“属性名”,“属性值”);
将Document保存到本地XML中
1.实例化输出格式:OutputFormat.createPrettyPrint()
2.指定输出文件路径:XMLWriter
3.直接将对象集合,使用c标签展示到XML文件中
1.将对象集合保存到请求域中
2.在jsp页面,使用C标签编译对象集合
二.XML解析
1.DOM(Document Object Model 文档对象模型)解析
1.实例化Document工厂:DocumentBuilderFactory
2.实例化Document构造器:DocumentBuilder
3.通过构造器读取数据(解析数据):parse()
4.得到根节点:getDocumentElement()
5.得到根节点下面的所有子节点(NodeList):getChildNodes()
6.遍历所有的子节点,得到某一个子节点item()
7.得到属性的值:getAttribute(“属性名”)
8.判断是否是标签:node.getNodeType==Node.ELEMNT_NODE
9.得到标签内容:getTextContent()
2.Dom4j解析(Jaxp,JDOM)
1.实例化SAX读取器:SAXReader
2.读取:read()
3.得到根节点:getRootElement()
3.SAX解析(XML:Simple API for XML)
1.实例化SAX解析器工厂:SAXParserFactory
2.实例化SAX解析器:SAXParser
3.开始解析:parse()方法
4.DOM 和 SAX 解析区别:
1.DOM解析占用内存比较大,但是方便对XML进行CRUD(增删查改)
2.SAX优点是占用内存小,解析速度快,缺点只适合做文档读取,不适合做CRUD
package com.zking.test;
import Java.io.File;
import java.io.IOException;
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解析XML
* @author Administrator
*
*/
public class TestParseXMLByDOM {
public static void main(String[] args) {
try {
//1.实实例化DocumentBuilderFactory
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//2.通过dbf获取DocumentBuilder
DocumentBuilder db=dbf.newDocumentBuilder();
//3.解析
Document document=db.parse(new File("students.xml"));
//4.获取跟节点<students>
Element students=document.getDocumentElement();
//5.获取所有的<student>节点
//第一种方法
NodeList nodeList=students.getElementsByTagName("student");
for (int i = 0; i < nodeList.getLength(); i++) {
//node element
Element student=(Element) nodeList.item(i);
//获取属性
String sid=student.getAttribute("sid");
String sname=student.getAttribute("sname");
//获取<student>下面的<sage><ssex>
Element elementSage=(Element) student.getElementsByTagName("sage").item(0);
Element elementSsex=(Element) student.getElementsByTagName("ssex").item(0);
String sage=elementSage.getTextContent();
String ssex=elementSsex.getTextContent();
System.out.println(sid+" "+sname+" "+sage+" "+ssex);
//第二种方法
//获取<student>下面的<sage><ssex>
/*NodeList nodeListChild=student.getChildNodes();
for (int j = 0; j < nodeListChild.getLength(); j++) {
Node node=nodeListChild.item(j);
if(node.getNodeType()==Node.ELEMENT_NODE){
Element element=(Element) nodeListChild.item(j);
//获取标签的名字
String elementName=element.getNodeName();
if("sage".equals(elementName)){
//获取<sage>的值
String sage=element.getTextContent();
System.out.println(" "+sage);
}else if("ssex".equals(elementName)){
String ssex=element.getTextContent();
System.out.println(" "+ssex);
}
}
}*/
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三.XML的CRUD
1.使用DOM增删查改
添加(在某个节点之前插入):insertBefore()
删除:removeChild()
2.XPath(在XML文档中查找信息的语言)
得到Document:1.实例化SAX读取器:SAXReader
2.读取:read()
3.得到根节点:getRootElement()
标签:
获取所有:persons.selectNodes(“/persons/person”);
取n个位置之后的:persons.selectNodes("/persons/person[position()>n]/pname");
取a--b之间的:persons.selectNodes("/persons/person[position()>a and position()<b]/pname");
取奇数位数据:persons.selectNodes("/persons/person[position() mod 2!=0]/pname");
获取第一个:persons.selectSingleNode("/persons/person[1]/pname");
获取最后一个:persons.selectSingleNode("/persons/person[last()]/pname");
获取第N个:persons.selectSingleNode("/persons/person[n]/pname");
属性:
取所有的属性值:persons.selectNodes("/persons/person/@属性名");
取某个属性X的值为Y的数据:persons.selectNodes("/persons/person[@x='y']/pname");