一:XML解析的简介
*xml是标记型文档 js是使用dom解析标记型文档。 js的解析过程:根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象
xml的解析方式:dom和sax
- dom方式解析:根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象。
缺点:如果文件过大,造成内存溢出
优点:很方便实现增删改操作 - sax方式解析:
采用事件驱动,边读边解析:从上到下,一行一行的解析,解析到某一个对象,返回对象名称
缺点:不能实现增删改操作
优点:如果文件过大不会造成内存溢出,方便实现查询操作
画图分析:
如果解析xml,解析器。不同的公司和组织提供了针对dom和sax方式的解析器,通过api方式提供 - sun公司提供了针对dom和sax的解析器 jaxp
- domj组织提供了针对dom和sax的解析器 dom4j
- jdom组织提供了针对dom和sax解析器 jdom
二:JASP的操作
1.查询节点
public class JsapText1 {
public static void main(String[] args) throws ParserConfigurationException {
/*
* 1.创建解析器工厂 2.根据解析器工厂创建解析器 3.解析xml返回document 4.得到所有的name元素
* 5.返回集合,遍历集合,得到每一个name元素
*/
// 创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
// 根据解析器工厂创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 解析xml返回document
try {
Document document = builder.parse("src/person.xml");
// 得到name元素
NodeList list = document.getElementsByTagName("name");
for (int i = 0; i < list.getLength(); i++) {
Node name1 = list.item(i);
System.out.println(name1.getTextContent());
}
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.增加节点
//在第一个p1下添加一个节点<sex></sex>
public static void addSex() throws Exception {
/*
* 1.创建解析器工厂
* 2.通过解析器工厂制造解析器
* 3.解析xml返回document
* 4.创建新增节点
* 5.添加几点
* 6.回写xml文件
*/
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=builderFactory.newDocumentBuilder();
Document document=builder.parse("src/person.xml");
Node nodeP1=document.getElementsByTagName("p1").item(0);
Element sex=document.createElement("sex");
Text text1=document.createTextNode("女");
sex.appendChild(text1);
nodeP1.appendChild(sex);
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
3.修改节点
//修改第一个sex节点下的值为男
private static void modifySex() throws Exception {
/*
* 1.使用解析器工厂创建解析器,解析xml文件
* 2.找到第一个sex节点
* 3.修改值
* 4.会写xml文件
*/
DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder =documentBuilderFactory.newDocumentBuilder();
Document document=documentBuilder.parse("src/person.xml");
Node node1=document.getElementsByTagName("sex").item(0);
node1.setTextContent("男");
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();
transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));
}
4.删除节点
//删除sex节点
private static void delSex() throws Exception {
/*
* 1.使用解析器工厂创建解析器,解析xml文件
* 2.找到第一个sex节点
* 3.找到sex的父节点,依靠父节点删除sex
* 4.会写xml
*/
DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder =documentBuilderFactory.newDocumentBuilder();
Document document=documentBuilder.parse("src/person.xml");
Node node1=document.getElementsByTagName("sex").item(0);
Node node2=node1.getParentNode();
node2.removeChild(node1);
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();
transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));
}
5.遍历所有节点
//遍历节点,把所有节点元素获取到
private static void listElement() throws Exception{
/*
* 1.使用解析器工厂创建解析器,解析xml文件
* 2.使用递归操作遍历所有节点
*/
DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder =documentBuilderFactory.newDocumentBuilder();
Document document=documentBuilder.parse("src/person.xml");
list(document);
}
private static void list(Node node) {
//判断node节点是不是元素类型,因为在xml中换行也是一个节点
if(node.getNodeType()==Node.ELEMENT_NODE) {
System.out.println(node.getNodeName()+":");
}
NodeList list=node.getChildNodes();
for(int i=0;i<list.getLength();i++) {
Node node1=list.item(i);
list(node1);
}
}