解析XML文件(包含DOM4J,Xpath,SAX)第一部分
XML解析器分为两类,分别是DOM和SAX。
DOM:(Document Object Model 即文档对象模型)是W3C组织推荐的处理XML的一种标准方式。
SAX:(Simple API for XML)不是官方标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它。
a)DOM一次性将整个XML文件读到内存,形成一个倒状的树形结构。
b)SAX是多次将XML文件读到内存。
1.基于DOM4J解析XML文件
首先在Eclipse中导入dom4j-1.6.1.jar包。
在Eclipse中新建一个car.xml文件,样式如下:
//用dom4j解析xml文件
public class XMLDemo {
public static void main(String[] args) throws Exception {
//创建dom4j解析器
SAXReader saxReader = new SAXReader();
//加载需要解析的xml文件,Document对象代表XML文件在内存中的映像。
Document document = saxReader.read(new File("src/com/YL/MyXML/car.xml")); //new File()括号中的内容是car.xml文件在Eclipse中的文件路径。
//取得根元素
Element rootElement = document.getRootElement();
//显示根元素的名称
//System.out.println(rootElement.getName()); //此处输出的结果为“车辆清单”,是xml文件中最外边的元素,即根元素。
//取得根元素下的子元素
List<Element> elementList = rootElement.elements();
//System.out.println("共有" + elementList.size() + "辆车。"); // 输出子元素的个数
for (Element element : elementList) { //foreach循环
System.out.println("车牌: " + element.elementText("车牌")); //获取车牌标签中的内容
System.out.println("产地: " + element.elementText("产地")); //获取产地标签中的内容
System.out.println("单价: " + element.elementText("单价")); //获取单价标签中的内容
System.out.println("出产时间: " + element.element("车牌").attributeValue("出产时间")); //获取车牌中的属性"出产时间"的内容。
System.out.println("-----------------------------------");
}
}
}
输出结果如下:
车牌: 奥迪
产地: 北京
单价: null
出产时间: 2010年
-----------------------------------
车牌: 本田
产地: 广州
单价: null
出产时间: 2011年
-----------------------------------
方法中用到的API:
Element.getName() 获取元素的名称
Element.elements() 取得该元素下的所有直接子元素
Element.elementText() 从一个元素导航到另一个元素且取出该元素的文本。
Element.attributeValue() 取得一个元素对应的属性
使用DOM4J操作XML文件的CUD(create/update/delete)
a) public void create() throws Exception{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("src/com/YL/MyXML/car.xml"));
Element rootElement = document.getRootElement();
//取得第一辆汽车
Element firstElement = (Element) rootElement.elements().get(0);
//添加新元素"单价",并设置文本为30
firstElement.addElement("单价").setText("30"); //在内存中对xml文件中的内容进行了修改
//将内存中的xml文件写入到硬盘中
OutputFormat format = OutputFormat.createPrettyPrint(); //使用缩格形式写xml
OutputStream os = new FileOutputStream("src/com/YL/MyXML/car.xml");
XMLWriter writer = new XMLWriter(os,format); //(输出的什么地方,以什么格式输出)
writer.write(document); //执行写入的操作。
writer.close(); //流之间嵌套的时候,只需关闭外部流即可。
}
执行后的car.xml文件效果如下:
b) public void update() throws Exception{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("src/com/YL/MyXML/car.xml"));
Element rootElement = document.getRootElement();
//取得第一辆汽车
Element firstElement = (Element) rootElement.elements().get(0);
firstElement.element("单价").setText("70");
//将内存中的xml文件写入到硬盘中
OutputFormat format = OutputFormat.createPrettyPrint(); //使用缩格形式写xml
OutputStream os = new FileOutputStream("src/com/YL/MyXML/car.xml");
XMLWriter writer = new XMLWriter(os,format); //(输出的什么地方,以什么格式输出)
writer.write(document); //执行写入的操作。
writer.close(); //流之间嵌套的时候,只需关闭外部流即可。
}
执行的效果如下:
c) public void delete() throws Exception{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("src/com/YL/MyXML/car.xml"));
Element rootElement = document.getRootElement();
//取得第一辆汽车
Element firstElement = (Element) rootElement.elements().get(0);
Element priceElement = firstElement.element("单价");
firstElement.remove(priceElement); //第一种删除方法
//firstElement.getParent().remove(priceElement); //第二种删除方法
//将内存中的xml文件写入到硬盘中
OutputFormat format = OutputFormat.createPrettyPrint(); //使用缩格形式写xml
OutputStream os = new FileOutputStream("src/com/YL/MyXML/car.xml");
XMLWriter writer = new XMLWriter(os,format); //(输出的什么地方,以什么格式输出)
writer.write(document); //执行写入的操作。
writer.close(); //流之间嵌套的时候,只需关闭外部流即可。
}
执行的效果如下: