XML的解析
1.xml解析方式
DOM方式:Document Object Model,文档对象模型,W3C推荐的使用方式。
SAX方式:Simple API for XML,不是官方标准,但是属于开源社区XML-DEV,几乎所有的XML解析器都支持。
2.xml解析开发包
JAXP:SUN公司推出的解析标准实现。
Dom4J:Dom4J开源社区提供的解析开发包(sun公司的一些技术实现都在使用,使用广泛)。
JDom:开源组织提供的开发包。
JAXP解析开发包
1.jaxp的api
jaxp是javase的一部分
jaxp解析器主要在javax.xml.parsers包内定义
下分为4个类
dom:
.DocumentBuilder解析器类
.抽象类
.该类实例可以通过DocumentBuilderFactory.newDocumentBuilder()方法获取。
.通过parsers("xml文件路径");解析xml文件,返回Document整个文档。
4.Document为接口,父接口为Node。
5.Document中的方法getElementsByTagname(String Tagname)可以得到xml中的标签名,返回NodeList集合
6.createElement(String tagname);创造标签
7.createTextNode(Strig text);创造文本节点
8.和js中一样,可以使用appendChild(Node s); removeChild(Node s); replaceChild(Node new,Node old);方法,具体可以查看api
9.NodeList的方法:getLength();得到集合长度。item(int x);返回在x处的元素,返回值为Node。
2.DocumentBuilderFactory解析器工厂
抽象类
可以通过newInstance获取实例
sax:
.SaxParsers解析器类
.SaxParsersFactory解析器工厂
2.jaxp实例
1.解析一个xml文件
xml文件盒java文件在同一个包内,my.package
xml文件(路径src/my/2.xml),现在需要查询xml文件中name标签的值
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1>
<name>SS1</name>
<age>20</age>
</p1>
<p1>
<name>SS2</name>
<age>21</age>
</p1>
</person>
java文件(路径src/my/JAXP.java)
package my;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
public class JAXP {
public static void main(String args[]) throws Exception
{
DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();
Document document=documentbuilder.parse("src/my/2.xml");
NodeList nodelist=document.getElementsByTagName("name");
for(int i=;i<nodelist.getLength();i++)
{
System.out.println("name="+nodelist.item(i).getTextContent());//getTextContent()得到标签里内容
}
}
}
运行后得到name标签的值
通过上例可以看出,想要解析一个xml文件,并查询标签信息,需要几个步骤
1.通过DocumentBuilderFactory.newInstance();方法创建DocumentBuilderFactory 对象。
2.通过DocumentBuilderFactory 对象.newDocumentBuilder();方法创建DocumentBuilder 对象。
3.通过DocumentBuilder 对象.parse(“xml文件路径”);方法创建Document 对象。
4.通过Document 对象.getElementsByTagName(“标签名”);方法创建NodeList 对象。
5.通过NodeList 对象.getLength();方法遍历Node元素,并通过NodeList 对象.item(i)方法获得所需的Node对象,再通过相应方法查询标签信息(比如Node对象.getTextContent()获取标签内容)。
2.给xml文件添加一个标签
假设实现效果为在1中的xml文件中每个人的信息都添加一个
<sex>...</sex>
标签
xml原文件(路径src/my/2.xml)
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1>
<name>SS1</name>
<age>20</age>
</p1>
<p1>
<name>SS2</name>
<age>21</age>
</p1>
</person>
java文件(路径src/my/JAXP.java)
package my;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
public class JAXP {
public static void main(String args[]) throws Exception
{
add();
}
private static void add() throws Exception{
DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();
Document document=documentbuilder.parse("src/my/2.xml");
NodeList nodelist=document.getElementsByTagName("p1");
String [] sex={"男","女"};
for(int i=;i<nodelist.getLength();i++)
{
Element s1=document.createElement("sex");
Text s2=document.createTextNode(sex[i]);
s1.appendChild(s2);
nodelist.item(i).appendChild(s1);
}
//因为解析xml的机制是先在内存中开辟一块内存,用来存放xml的解析树,所以现在修改的还只是内存中的xml解析树,实际上对实际的xml原文件没有进行修改,
//所以需要将内存中修改过的xml回写进文件,才能实现原文件的修改
TransformerFactory transformerfatory=TransformerFactory.newInstance();
Transformer transformer=transformerfatory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml"));
}
}
修改后的xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>SS1</name>
<age>20</age>
<sex>男</sex></p1>
<p1>
<name>SS2</name>
<age>21</age>
<sex>女</sex></p1>
</person>
3.修改xml文件
将2中添加标签后的xml文件的sex标签内容修改掉
xml修改前(scr/my/2.xml),将sex标签中的男女值对调
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>SS1</name>
<age>20</age>
<sex>男</sex></p1>
<p1>
<name>SS2</name>
<age>21</age>
<sex>女</sex></p1>
</person>
java文件
package my;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
public class JAXP {
public static void main(String args[]) throws Exception
{
changeSex();
}
private static void changeSex() throws Exception{
DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();
Document document=documentbuilder.parse("src/my/2.xml");
NodeList nodelist=document.getElementsByTagName("sex");
String [] sex={"女","男"};
for(int i=;i<nodelist.getLength();i++)
{
nodelist.item(i).setTextContent(sex[i]);
}
//回写xml
TransformerFactory transformerfatory=TransformerFactory.newInstance();
Transformer transformer=transformerfatory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml"));
}
}
修改后的xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>SS1</name>
<age>20</age>
<sex>女</sex></p1>
<p1>
<name>SS2</name>
<age>21</age>
<sex>男</sex></p1>
</person>
4.删除xml中的标签
将3中的xml文件中的sex标签删去
删除前的xml文件(scr/my/2.xml)
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>SS1</name>
<age>20</age>
<sex>女</sex></p1>
<p1>
<name>SS2</name>
<age>21</age>
<sex>男</sex></p1>
</person>
java文件
package my;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
public class JAXP {
public static void main(String args[]) throws Exception
{
deleteSex();
}
private static void deleteSex() throws Exception{
DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();
Document document=documentbuilder.parse("src/my/2.xml");
NodeList nodelist=document.getElementsByTagName("p1");
for(int i=;i<nodelist.getLength();i++)
{
// Node parent=nodelist.item(i).getParentNode();
nodelist.item(i).removeChild(nodelist.item(i).getLastChild());
}
//回写xml
TransformerFactory transformerfatory=TransformerFactory.newInstance();
Transformer transformer=transformerfatory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml"));
}
}
删除sex标签的xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>SS1</name>
<age>20</age></p1>
<p1>
<name>SS2</name>
<age>21</age>
</p1>
</person>
对xml的元素进行遍历
xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>SS1</name>
<age>20</age></p1>
<p1>
<name>SS2</name>
<age>21</age>
</p1>
</person>
java文件
package my;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
public class JAXP {
public static void main(String args[]) throws Exception
{
listElement();
}
private static void listElement() throws Exception{
DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();
Document document=documentbuilder.parse("src/my/2.xml");
// Node node=document;
// NodeList nodelist=node.getChildNodes();//得到一层子节点(在这里就是xml的根节点了)
getNode(document,);
}
private static void getNode(Node node,int n)
{
NodeList nodelist=node.getChildNodes();
for(int i=;i<nodelist.getLength();i++)
{
for(int j=;j<n;j++)
{
System.out.print(" ");
}
if(nodelist.item(i).getNodeType()==Node.ELEMENT_NODE)
{
System.out.println(nodelist.item(i).getNodeName());
getNode(nodelist.item(i),n+);
}
}
}
}
控制台输出
person
p1
name
age
p1
name
age