解析XML的方式分为以下几种:
JAXP (JavaApi for Xml Programming) – sun公司的一套操作XML的API.- DOM解析-一次性的将数据全部装入内存。
- SAX解析-边读取边解析。
</pre>的解析技术。目前jdom已经完全被dom4j替代。<ul><li><span style="white-space:pre"></span>jDom – Dom4j的前身。</li><li><span style="white-space:pre"></span>Dom4j在性能和速度上都比sun公司的要快,而且支持Xpath快速查找,目前像Spring,Hibernate这些大型的框架,都是用的dom4j.</li></ul><p>StAX – JDK1.6新特性,做为JAXP的新成员已经集成在了JDK6当中。</p><p></p><p>下面就来演示<span style="color:#ff6666">dom</span>解析:</p><p></p><div>关键包包: </div><div><span style="color:#97CDCC">•</span>javax.xml.parse – 关键类<span style="color:red">DocumentBuilder</span>,文档解析对像。 </div><div><span style="color:#97CDCC">•</span>org.w3c.dom– 关键类<span style="color:red">Document</span>代表内存中的文档对像模型。</div><div><span style="color:#97CDCC">•</span>java.xml– 关键类<span style="color:red">Transformer</span>,用于将内存中的文档保存到文件中。</div><p></p><p>下面是users.xml文件代码</p><p></p><pre code_snippet_id="1735096" snippet_file_name="blog_20160629_2_9510072" name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<users>
<span style="white-space:pre"> </span><user id="A001">
<span style="white-space:pre"> </span><name >张三</name>
<span style="white-space:pre"> </span><age>20</age>
<span style="white-space:pre"> </span></user>
<span style="white-space:pre"> </span><user id="A002">
<span style="white-space:pre"> </span><name>王建安</name>
<span style="white-space:pre"> </span><age>24</age>
<span style="white-space:pre"> </span></user>
</users>
首先要获得document对象
第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbf对象;
第二步,通过dbf对象创建出一个DocumentBuilder对象;
第三步,通过db对象创建出一个Document对象;
然后通过document对象对dom数进行解析,方法如同javascript的dom解析方法()
需求:把第一个user节点的name的值取出来
下面是解析代码
//第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbf对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//第二步,通过dbf对象创建出一个DocumentBuilder对象
DocumentBuilder db=dbf.newDocumentBuilder();
//第三步,通过db对象创建出一个Document对象
Document document=db.parse("./xml3/users.xml");
Node root=document.getFirstChild();//第一个孩子一定是根节点
//System.out.println(root.getFirstChild());
/*这里是#text----dom中把空白符也看成是一个Node,这种情况对我们的解析通常会造成很大的麻烦
//※※为解决上面的问题,我们以后解析时尽量不要用Node,而要用Element。
因为Element是元素它不包含属性和文字内容(包括空白符),因此可避开空白符的干扰 */
Element eRoot=(Element) root;
NodeList list=eRoot.getElementsByTagName("user");
Element eUser1=(Element) list.item(0);
//要把Node强转成Element,因为Element是子接口,里面有getElementBy*等方法,而Node没有(只能采用childNodes的方式,这种方式会受空白符的干扰)
NodeList listName=eUser1.getElementsByTagName("name");
Element eName=(Element) listName.item(0);
String name=eName.getTextContent();//标签内部所包含的文本内容----innerText
System.out.println(name);//张三
练习:用Java对xml文档进行CRUD---创建,遍历,更新,删除
记住:要对xml文档进行修改,把内存中的当前dom对象存储到xml文件,步骤如下:
<span style="color:#330033;">TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(dom), new StreamResult("./xml4/users.xml"));//把xml源 输出到 目标 ---如果目标存在则是更新,否则是创建</span><span style="color:#ff0000;">
</span>
- 创建 --需求:添加一个新的user
public void create() throws SAXException, IOException, ParserConfigurationException, TransformerException{
//第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbf对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//第二步,通过dbf对象创建出一个DocumentBuilder对象
DocumentBuilder db=dbf.newDocumentBuilder();
//第三步,通过db对象创建出一个Document对象
Document document=db.parse("./xml3/users.xml");
Node root=document.getFirstChild();//第一个孩子一定是根节点
//创建一个新的user
Element eUser=document.createElement("user");
eUser.setAttribute("id", "C003");
Element eName=document.createElement("name");
eName.setTextContent("Tom");
//添加到user节点上
eUser.appendChild(eName);
Element eAge=document.createElement("age");
eName.setTextContent("50");
//添加到user节点上
eUser.appendChild(eAge);
//添加到root节点上
root.appendChild(eUser);
TransformerFactory tf=TransformerFactory.newInstance();
Transformer tran=tf.newTransformer();
tran.transform(new DOMSource(root), new StreamResult("./xml3/users.xml"));//root,document都行
}
- 删除---需求:删除最后一个元素
public void delete() throws SAXException, IOException, ParserConfigurationException{
Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("./xml3/users.xml");//三合一的步骤
Element root=(Element) document.getFirstChild();
NodeList list=root.getElementsByTagName("user");
Element user=(Element) list.item(list.getLength()-1);
root.removeChild(user);
}
- 更新---把最后一个user的年龄+5
public void update() throws SAXException, IOException, ParserConfigurationException, TransformerException{
Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("./xml3/users.xml");//三合一的步骤
Element root=(Element) document.getFirstChild();
NodeList list=root.getElementsByTagName("user");
Element user=(Element) list.item(list.getLength()-1);
Element eAge=((Element)user.getElementsByTagName("age").item(0));
String age=eAge.getTextContent();
int tempAge=Integer.parseInt(age)+5;
eAge.setTextContent(""+tempAge);
//root.replaceChild(newChild, oldChild)也可以这是替换
//把内存中的当前dom对象存储到xml文件
TransformerFactory tf=TransformerFactory.newInstance();
Transformer tran=tf.newTransformer();
tran.transform(new DOMSource(document), new StreamResult("./xml3/users.xml"));
}
- 这是遍历
public void query() throws ParserConfigurationException, SAXException, IOException{
//第一步,通过DocumentBuilderFactory类中的工厂方法等到一个dbf对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
//第二步,通过dbf对象创建出一个DocumentBuilder对象
DocumentBuilder db=dbf.newDocumentBuilder();
//第三步,通过db对象创建出一个Document对象
Document document=db.parse("./xml3/users.xml");
Element root=(Element) document.getFirstChild();
NodeList list=root.getElementsByTagName("user");
for(int i=0;i<list.getLength();i++){
Element user=(Element) list.item(i);
String id=user.getAttribute("id");
String name=user.getElementsByTagName("name").item(0).getTextContent();
String age=user.getElementsByTagName("age").item(0).getTextContent();
System.out.println("id:"+id+" name:"+name+ " age:"+age);
}
}