一、XML文件test.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?> <persons> <person> <name>xiaohui</name> <age>23</age> </person> <person> <name>yanzi</name> <age>20</age> </person> </persons>
二、JAVA程序:
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.*;
import java.io.File;
public class TraverseXML
{
public static void main(String[] args)
{
try{
String file = "TestData\\test.xml";
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
Document doc = docBuilder.parse(new File(file));
NodeList nodes = doc.getElementsByTagName("person");
System.out.println("总共有"+nodes.getLength()+"个人。");
for(int i=0;i<nodes.getLength();i++)
{
Node node = nodes.item(i);
NodeList childNodes = node.getChildNodes();
System.out.println("person有"+childNodes.getLength()+"个节点。");
for(int j=0;j<childNodes.getLength();j++)
{
Node childNode = childNodes.item(j);
if(childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getNodeName().equals("name"))
System.out.println("名字:"+childNode.getFirstChild().getNodeValue());
if(childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getNodeName().equals("age"))
System.out.println("年龄:"+childNode.getFirstChild().getNodeValue());
}
System.out.println();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
三、判断节点类型和获取节点的名字和值,Node对象具有以下三个方法可以实现。
getNodeType() :获取节点的类型,返回值为short类型。以下是节点类型表和对应的short值。
getNodeName():获取节点的名字,返回值为String类型。
getNodeValue():获取节点的值,如果节点类型为TEXT_NODE,则返回文本值,返回值为String类型。
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.io.OutputFormat;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
import java.io.*;
import org.dom4j.Attribute;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import java.util.List;
import java.util.Iterator;
import org.dom4j.QName;
public class dom4j {
public void readAttribute(String filename, String xpath, String attribute) {
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read(new File(filename));
List list = document.selectNodes(xpath);
Iterator iter = list.iterator();
while (iter.hasNext()) {
Element element = (Element) iter.next();
System.out.println("element= "+element);
System.out.println("element.attributeValue(attribute)= "+element.attributeValue(attribute));
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static void main(String[] argv) {
dom4j ptree = new dom4j();
ptree.printXML();
}
// 创建一个xml文件
public void changeXML() {
// 创建一个xml document对象
Document document = DocumentHelper.createDocument();
// 创建根节点元素
Element books = document.addElement("books");
// 给books添加注释
books.addComment("—An XML Example");
// 使用addProcessingInstruction()方法增加一个处理指令
books.addProcessingInstruction("target", "text");
// 在当前元素后增加一个子元素
Element bookone = books.addElement("bookone");
// 设置当前元素的属性
bookone.addAttribute("title", "XML study");
bookone.addAttribute("publisher", "angellove workers");
Element article = bookone.addElement("article");
article.addAttribute("level", "high");
article.addAttribute("date", "December-2007");
Element titleElement = article.addElement("title");
// 设置当前元素的文本值,即是内容
titleElement.setText("Java configuration with XML");
Element authorElement = article.addElement("author");
Element firstNameElement = authorElement.addElement("firstname");
firstNameElement.setText("angel");
Element lastNameElement = authorElement.addElement("lastname");
lastNameElement.setText("free");
// XML 声明 <?xml version="1.0" encoding="UTF-8"?> 自动添加到 XML 文档中。
try {
// 创建一个xml写入流,将生成的xml文件写入指定的文件中
// 使用优雅的方式写入(一共有三种方式:普通方式,优雅方式和紧凑方式)
//紧凑方式写入format = OutputFormat.createCompactFormat();
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
XMLWriter output = new XMLWriter(
new FileWriter(new File("books.xml")), format);
output.write(document);
output.close();
}
catch (IOException e) {
System.out.println(e.getMessage());
}
}
// 使用XPath表达式的查询
public void modifXML(File inputXml) {
try {
//创建一个读取xml文件的对象
SAXReader saxReader = new SAXReader();
//读取并获得xml文档
Document document = saxReader.read(inputXml);
//使用XPATH表达式从article元素中获得level节点列表
List list = document.selectNodes("//article/@level");
//创建一个迭代器.
Iterator iter = list.iterator();
while (iter.hasNext()) {
//获得level节点的属性
Attribute attribute = (Attribute) iter.next();
if (attribute.getValue().equals("high"))
//设置属性的值
attribute.setValue("low");
}
list = document.selectNodes("//article/@date");
iter = list.iterator();
while (iter.hasNext()) {
Attribute attribute = (Attribute) iter.next();
if (attribute.getValue().equals("December-2007"))
attribute.setValue("October-2006");
}
list = document.selectNodes("//article");
iter = list.iterator();
while (iter.hasNext()) {
Element element = (Element) iter.next();
Iterator iterator = element.elementIterator("title");
while (iterator.hasNext()) {
Element titleElement = (Element) iterator.next();
//获得属性的文本.
if (titleElement.getText().equals("Java configuration with XML"))
//重新设置属性的文本
titleElement.setText("good good study,day day up");
}
}
list = document.selectNodes("//article/author");
iter = list.iterator();
while (iter.hasNext()) {
Element element = (Element) iter.next();
Iterator iterator = element.elementIterator("firstname");
while (iterator.hasNext()) {
Element firstNameElement = (Element) iterator.next();
if (firstNameElement.getText().equals("angel"))
firstNameElement.setText("god");
}
}
list = document.selectNodes("//article/author");
iter = list.iterator();
while (iter.hasNext()) {
Element element = (Element) iter.next();
Iterator iterator = element.elementIterator("lastname");
while (iterator.hasNext()) {
Element lastNameElement = (Element) iterator.next();
if (lastNameElement.getText().equals("free"))
lastNameElement.setText("dark");
}
}
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
XMLWriter output = new XMLWriter(
new FileWriter(new File("modifyBooks.xml")), format);
output.write(document);
output.close();
}
catch (DocumentException e) {
System.out.println("aaaa" + e.getMessage());
}
catch (IOException e) {
System.out.println("rrr" + e.getMessage());
}
}
// 递归遍历:打印出xml树
public void printXML() {
System.out.println("<?xml version='1.0' encoding='GBK'?>");
System.out.println();
try {
SAXReader sreader = new SAXReader();
Document document = sreader.read(new File("books.xml"));
Element root = document.getRootElement();
printtree(root, 0);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void printtree(Element node, int i) {
//打印一个节点开始"<",前面有空格
System.out.println();
for (int j = 1; j <= i; j++) {
System.out.print(" ");
}
System.out.print("<");
//打印节点的名字
String name = node.getName();
System.out.print(name);
//打印节点属性和属性值
Iterator it = node.attributeIterator();
while (it.hasNext()) {
Attribute attr = (Attribute) it.next();
System.out.print(" " + attr.getName() + "=" + attr.getValue());
}
//打印节点的结束">";
System.out.print(" >");
//判断是不是有文本值
if (!"".equals(node.getText())) {
System.out.print(node.getText());
}
//此处开始递归调用
Iterator ite = node.elementIterator();
while (ite.hasNext()) {
Element snode = (Element) ite.next();
printtree(snode, i + 2);
}
for (int j = i; j >= 1; j--) {
System.out.print(" ");
}
System.out.println("</" + name + ">");
}
}