xml的解析:
不同的公司和组织都提供了针对dom和sax方式的解析器,通过api方式提供
sun公司提供了针对dom和sax解析器 jaxp
dom4j组织,针对dom和sax解析器 dom4j(*** 实际开发中****)
jdom组织,针对dom和sax解析器 jdom
1、首先讲jaxp对xml的解析
如何去查看该jaxp解析器?
jaxp解析器就在java.xml.parsers包里面
我们需要了解的方法
//dom
DocumentBuilder类:解析器类
这个类是一个抽象的类,不能直接实例化,不能new
但是可以从DocumentBuilderFactory的newDocumentBuilder()获取
//解析xml方法
parse("xml")路径,返回值是:Document、
-在document里面的方法:
//这个方法可以得到标签,返回NodeList
getElementByTagName(String TagName)
//创建一个标签
createElement(String tagName):
//创建文本
createTextNode(String data)
//把文本添加到标签下面
appendChild(Node newChild);
//删除节点
removeChild(Node oldChild);
//获取父节点
getParentNode();
NodeList list
//获取长度
getLength();
//下标取到具体的值
item(int index);
//得到标签的内容
getTextContent();
DocumentBuilderFactory:解析器工厂
也是一个抽象类,不能实例化
但是可以通过newInstance(),获取到实例化
2、演示所有的案例
假如说:有个person.xml在src文件夹下面
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<person>
<p1>
<name>zhangsan</name>
<age>20</age>
</p1>
<p1>
<name>lisi</name>
<age>30</age>
</p1>
</person>
每次解析的三个步骤:这是固定的
// 1、创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newIntance();
// 2、根据解析器工厂创建解析器
DocunmentBuilder builder = builderFactory.newDocumentBuilder();
// 3、解析xml返回document
Document document = builder.parse("src/person.xml");
查询:所有的name元素的值
//这里上面的前三步骤是必不可少的,这里忽略不写,直接从第四步骤
//得到name元素
NodeList list = document.getElementsByTagName("name");
//遍历集合
for(int i=0;i<list.getLength();i++) {
Node name1 = list.item(i); //得到每一个name元素
//得到name元素里面的值
String s = name1.getTextContent();
System.out.println(s);
}
查询:第一个的name元素的值
//得到name元素
NodeList list = document.getElementsByTagName("name");
//使用下标 得到第一个元素
Node name1 = list.item(1);
//得到name里面的具体的值
String s1 = name1.getTextContent();
System.out.println(s1);
添加:在第一个p1下面添加< sex>nv< /sex>
//需求就是:在第一个p1下面添加< sex>nv< /sex>
//所以我们需要做的是:1)找到第一个p1,2)创建节点<sex>,3)添加文本,4)添加节点
//找到第一个p1
NodeList ps = document.getElementsByTagName("p1");
Node p1 = ps.item(1);
//创建节点
Element sex = document.createElement("sex");
//创建文本
Text text = document.createTextNode("nv");
//添加文本
sex.appendChild(text);
//添加节点
p1.appendChild(sex1);
//回写xml,写法跟创建解析器步骤类似。下在下面
【为什么要进行回写?】
答:我们所有操作的xml都是在内存里面进行操作,他不会影响我们的xml文件,因此需要回写,把数据重新写到了xml中
【认识transformer:】
该类是一个抽象类,同样可以找到它的工厂解析器,所以它的实例化还是“三部曲”
//创建解析器工厂
TransformerFactory transformerFactory = TransformerFactory.newInstance();
//得到解析器
Transformer transformer = transformerFactory.newTransformer();
//回写操作,等到缓冲数据,写到新的文件
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
修改:第一个p1下面的sex内容是nan
//需求:第一个p1下面的sex内容。
//步骤:得到第一个p1下面的sex,修改内容
//代码
//得到sex
Node sex1 = document.getElementsByTagName("sex").item(0);
//修改sex值
sex1.setTextContent("nan");
//回写操作,省略
删除:nan节点
//需求:删除:<sex>nan</sex>节点。
//步骤:得到第一个p1下面的sex,然后删除
//得到sex元素
Node sex1 = document.getElementsByTagName("sex").item(0);
//得到sex1父节点,这里需要注意的是,删除节点是利用父节点去删除哦,至于获取父节点的方法,也可以是document.getElementsByTagName("p1").item(0);
Node p1 = sex1.getParentNode();
//删除操作
p1.removeChild(sex1);
//回写操作,省略
遍历:所有的节点
//递归遍历的方法
private static void list1(Node node) {
//判断是元素类型时候才打印
if(node.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
//得到一层子节点
NodeList list = node.getChildNodes();
//遍历list
for(int i=0;i<list.getLength();i++) {
//得到每一个节点
Node node1 = list.item(i);
list1(node1);
}
}