JAVA生成XML

2 篇文章 0 订阅

DOM方式:

package DomTest;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DOMTest {

    /***
     * 生成XML
     */
    public void creatXML(){
        DocumentBuilder db=getDocumentBuilder();
        Document document=db.newDocument();

        document.setXmlStandalone(true);//设置XML的standalone属性
        //创建根节点
        Element bookstore= document.createElement("bookStore");
        //添加子节点book
        Element book=document.createElement("book");
        //添加子节点name
        Element name=document.createElement("name");
        book.appendChild(name);
        //添加子节点内容
        name.setTextContent("人猿泰山");

        book.setAttribute("id", "1");
        //将book子节点添加到bookstore中
        bookstore.appendChild(book);
        //将bookstore节点(已包含book)添加到dom数中
        document.appendChild(bookstore);

        //
        TransformerFactory tff=TransformerFactory.newInstance();
        try {
            Transformer tf=tff.newTransformer();

            //让DOM树输出过程中正常换行
            tf.setOutputProperty(OutputKeys.INDENT, "yes");
            tf.transform(new DOMSource(document), new StreamResult(new File("books1.xml")));
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static DocumentBuilder getDocumentBuilder(){
        // 创建一个DocumentBuilderFactory对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 创建DocumentBuilder对象
        DocumentBuilder db=null;
        try {
            db = dbf.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   

        return db;
    }

    public static void main(String[] args) {

        // 创建一个DocumentBuilder的对象
        try {

            // 通过DocumentBuilder对象的parse方法加载books.xml文件
            // 到当前项目下
            Document document = getDocumentBuilder().parse("books.xml");
            // 获取所有book节点的集合
            NodeList bookList = document.getElementsByTagName("book");
            //通过nodeList的getLength()方法获取bookLIst的长度
            System.out.println("一共有:"+bookList.getLength()+"本书");
            //便利各个book节点
            for (int i = 0; i < bookList.getLength(); i++) {
                System.out.println("++++++++++++开始遍历第"+(i+1)+"本书+++++++++++");
                //方式一,不知道有多少节点,通过循环来遍历所有节点。

                //通过 item(i)获取一个book节点,nodeList
                Node book=bookList.item(i);
                //获取book的属性的集合
                NamedNodeMap attrs=book.getAttributes();
                System.out.println("第"+(i+1)+"本书共有"+attrs.getLength()+"个属性");
                //便利book的属性
                for (int j = 0; j < attrs.getLength(); j++) {
                    //通过item()方法获取book节点的某一个属性
                    Node attr=attrs.item(j);
                    //获取属性名
                    System.out.println("属性名:"+attr.getNodeName());
                    //获取属性值
                    System.out.println("属性值:"+attr.getNodeValue());
                }


//              //方式二,知道有且只有一个节点。并且知道属性的名称为“id”
//              //强制类型转换将book节点类型转换为Element类型
//              Element book =(Element) bookList.item(i);
//              
//              //通过getAttribute(“id”)方法获取到属性的值
//              String attrValue=book.getAttribute("id");
//              System.out.println("id的属性的属性值为"+attrValue);


                //解析book节点的子节点,需要用到方式一中创建的book对象
                //获取子节点的集合
                NodeList childNodes=book.getChildNodes();

                //遍历childNodes获取每个子节点的节点名和节点值
                System.out.println("第"+(i+1)+"本书共有"+childNodes.getLength()+"个子节点");
                //循环遍历
                for (int j = 0; j < childNodes.getLength(); j++) {
                    //区分text类型的node和element类型的node
                    if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){
                        //输出了element类型节点的节点名
                        System.out.println("第"+(j+1)+"个节点名:"+childNodes.item(j).getNodeName());
                        //输出element类型节点的节点值
                        //需先获取当前节点的首个子节点,否则获取的是《name》标签的值NULL

                        //方式一:如果<name>节点下有多个子节点,此方法只输出确定的某个子节点的值
                        //同样要注意,<name>节点的第一个子节点的值是第一子节点的类型的值,还是NULL
                        System.out.println("节点值为:"+childNodes.item(j).getFirstChild()
                                .getNodeValue());
                        //方式二:如果<name>节点下有多个子节点,此方法输出所有子节点的text
                        System.out.println(childNodes.item(j).getTextContent());
                    }

                }

                System.out.println("++++++++++++结束遍历第"+(i+1)+"本书++++++++++++");
            }

        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 

        DOMTest test=new DOMTest();
        test.creatXML();
    }
}

SAX方式:
使用SAX解析时创建的SAXParserHandler.java

package test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;

import test2.SAXParserHandler;
import test3.Book;

public class SAXTest {

    public ArrayList<Book> parseXML(){
        // 通过SAXParseFactory的静态newInstance()
        //方法获取SAXParseFactory实例factory
        SAXParserFactory factory=SAXParserFactory.newInstance();
        SAXParserHandler handler=null;
        //通过SAXParserFactory实例的newSAXParser()
        //方法返回SAXParse实例parser
        try {
            SAXParser parser= factory.newSAXParser();
            //创建SAXParserHandler对象
            handler=new SAXParserHandler();         
            parser.parse("books.xml", handler);
            System.out.println("书的数量:"+handler.getBookList().size());
            for(Book book: handler.getBookList()){
                System.out.println(book.getId());
                System.out.println(book.getName());
                System.out.println(book.getAuthor());
                System.out.println(book.getPrice());
                System.out.println(book.getYear());
                System.out.println("-------------");
            }
        } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();            
        } catch (ParserConfigurationException | SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return handler.getBookList();       
    }

    public void createXML(){
        ArrayList<Book> bookList=parseXML();
        //生成XML
        //1、创建一个TransformFacroty对象
        SAXTransformerFactory tff=(SAXTransformerFactory) 
                SAXTransformerFactory.newInstance();
        try {
            //2、通过SAXTransformerFactory对象创建一个TransformerHandler对象
            TransformerHandler handler=tff.newTransformerHandler();
            //3、通过handler对象创建一个Transformer对象
            Transformer tr=handler.getTransformer();
            //4、通过Transformer对象对生成的XML文件进行设置
            //设置XML编码
            tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            //设置换行
            tr.setOutputProperty(OutputKeys.INDENT, "yes");
            //5、创建一个Result对象
            File f=new File("src/newbooks.xml");
            if(!f.exists()){
                f.createNewFile();
            }
            Result result=new StreamResult(new FileOutputStream(f));
            //6、创建result对象并使其与handler关联
            handler.setResult(result);
            //7、使用handler对象进行XML文件的编写
            //打开document
            handler.startDocument();
            AttributesImpl attr=new AttributesImpl(); 
            //开始标签
            handler.startElement("", "", "bookstore", attr);

            for(Book book:bookList){
                attr.clear();
                attr.addAttribute("", "", "id", "", book.getId());
                handler.startElement("", "", "book", attr);
                attr.clear();
                //创建name节点
                handler.startElement("", "", "name", attr);
                handler.characters(book.getName().toCharArray(),
                        0, book.getName().length());
                handler.endElement("", "", "name");
                //创建author节点
                attr.clear();
                handler.startElement("", "", "author", attr);
                handler.characters(book.getAuthor().toCharArray(),
                        0, book.getAuthor().length());
                handler.endElement("", "", "author");
                //创建price节点
                attr.clear();
                handler.startElement("", "", "price", attr);
                handler.characters(book.getPrice().toCharArray(),
                        0, book.getPrice().length());
                handler.endElement("", "", "price");
                //创建year节点
                //判断当有此节点时才进行创建操作
                if(book.getYear()!=null&&!book.getYear().trim().equals("")){

                    attr.clear();
                    handler.startElement("", "", "year", attr);
                    handler.characters(book.getYear().toCharArray(),
                            0, book.getYear().length());
                    handler.endElement("", "", "year");
                }


                handler.endElement("", "", "book");
            }


            //结束标签
            handler.endElement("", "", "bookstore");
            //关闭document
            handler.endDocument();

        } catch (TransformerConfigurationException | IOException | SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        SAXTest test=new SAXTest();
        test.createXML();
    }
}

DOM4J方式:
RSS就是一个特殊格式的XML

package Dom4jTest;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class DOM4JTest {

    public static void main(String[] args) {
        new DOM4JTest().createXML();
    }

    public void parseXML() {

        // TODO Auto-generated method stub
        // 创建SAXReader对象
        SAXReader reader = new SAXReader();
        // 通过reader对象read 方法加载book.xml
        try {
            Document document = reader.read(new File("src/res/books.xml"));
            // 通过document对象获取根节点bookstore
            Element bookStore = document.getRootElement();
            // 通过element对象的elementIterator方法获取迭代器
            Iterator it = bookStore.elementIterator();
            // 遍历迭代器,获取根节点中的信息
            while (it.hasNext()) {
                System.out.println("开始遍历一本书");
                Element book = (Element) it.next();
                // 获取book的属性名和属性值
                List<Attribute> bookAttrs = book.attributes();
                for (Attribute attr : bookAttrs) {
                    System.out.println("属性名:" + attr.getName() + "\t属性值:" + attr.getValue());
                }

                Iterator itt = book.elementIterator();
                while (itt.hasNext()) {
                    Element bookChild = (Element) itt.next();
                    System.out.println("节点名:" + bookChild.getName() + "\t节点值:" + bookChild.getStringValue());
                }

                System.out.println("结束遍历一本书" + "\n");
            }
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void createXML(){
        //1、创建Document对象,代表整个XML
        Document document=DocumentHelper.createDocument();
        //2、创建根节点
        Element rss=document.addElement("rss");
        //3、向rss节点中添加version属性
        rss.addAttribute("version", "2.0");
        //4、生成子节点及内容
        Element channel=rss.addElement("channel");
        Element title=channel.addElement("title");
        title.setText("新闻资讯");
        //设置换行
        OutputFormat format=OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        //5、生成XML文件
        File file=new File("rssnews.xml");
        XMLWriter writer;
        try {
            writer = new XMLWriter(new FileOutputStream(file),format);
            //设置是否转义,默认是true进行转义
            writer.setEscapeText(false);
            writer.write(document);
            writer.close();
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

JDOM方式:

package test;

import java.util.ArrayList;
import java.util.List;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

import test3.Book;

public class JDOMTest {
    private static ArrayList<Book> booksList = new ArrayList<Book>();

    public static void main(String[] args) {
        new JDOMTest().createXML();
    }

    public void parserXML() {
        // JDOM解析XML文件
        // 创建一个SAXBuilder对象
        SAXBuilder saxbuilder = new SAXBuilder();

        InputStream in;
        try {
            // 创建一个输入流,将xml文件加载到流中
            in = new FileInputStream("src/res/books.xml");
            // InputStreamReader ins=new InputStreamReader(in,"UTF-8");
            // 通过saxbuilder的build方法将输入流加载到saxbuilder中
            Document document = saxbuilder.build(in);

            // 通过document对象获取xml文件的根节点
            Element rootElement = document.getRootElement();

            // 获取根节点下的子节点的集合
            List<Element> bookList = rootElement.getChildren();

            // 使用foreach循环解析

            for (Element book : bookList) {
                Book bookEntity = new Book();
                System.out.println("开始解析第" + (bookList.indexOf(book) + 1) + "本书============");

                // 解析book的属性
                List<Attribute> attrList = book.getAttributes();

                // //知道节点属性名
                // book.getAttribute("id");

                // 针对不清楚book节点下属性名和数量的情况
                // 遍历attrList
                for (Attribute attr : attrList) {
                    // 获取属性名和属性值
                    String attrName = attr.getName();
                    String attrValue = attr.getValue();
                    System.out.println("属性名:" + attrName + "\t属性值:" + attrValue);
                    // 存储book节点
                    if (attrName.equals("id")) {
                        bookEntity.setId(attrValue);
                    }
                }

                // 对book节点的子节点的节点名和节点值进行遍历
                List<Element> bookChilds = book.getChildren();
                for (Element child : bookChilds) {
                    System.out.println("节点名:" + child.getName() + "\t节点值:" + child.getValue());

                    // 存储子节点名
                    if (child.getName().equals("name")) {
                        bookEntity.setName(child.getValue());
                    } else if (child.getName().equals("author")) {
                        bookEntity.setAuthor(child.getValue());
                    } else if (child.getName().equals("year")) {
                        bookEntity.setYear(child.getValue());
                    } else if (child.getName().equals("price")) {
                        bookEntity.setPrice(child.getValue());
                    }
                }

                System.out.println("结束解析第" + (bookList.indexOf(book) + 1) + "本书============");
                // 添加booksList集合对象
                booksList.add(bookEntity);
                bookEntity = null;
                System.out.println(booksList.size());
                System.out.println(booksList.get(0).getId());
                System.out.println(booksList.get(0).getName());
            }

        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (JDOMException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void createXML(){
        //1、生成一个根节点
        Element rss=new Element("rss");
        rss.setAttribute("version","2.0");//添加节点属性
        //2、生成一个document对象
        Document document=new Document(rss);

        Element channel=new Element("channel");
        rss.addContent(channel);
        Element title=new Element("title");
        title.setText("ceshiceshi测试");
        channel.addContent(title);

        Format format=Format.getCompactFormat();
        format.setIndent("");
        format.setEncoding("GBK");

        //创建XMLOutputter对象
        XMLOutputter outputer=new XMLOutputter(format);
        try {
            outputer.output(document, new FileOutputStream(new File("rssnews")));

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

生成方式对比
DOM 基于树结构,始终在内存中,方便增删改操作
SAX基于事件
JDOM 基于底层API
DOM4J基于底层API

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值