解析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();                //流之间嵌套的时候,只需关闭外部流即可。

}

执行的效果如下:

 

posted @ 2013-04-23 16:23  kuaileyuyi  阅读(341)  评论(0编辑  收藏  举报