ファイル処理のXML----DOM方式

27278 ワード

XML解析のいくつかの方法については、他人のブログを見に行くことができます。ここでは主にDOM、SAX、DOM M 4 Jの3つの方法でxmlを生成し、xmlを解析する例を示しています。4種類のXMLドキュメントの生成と解析方法の詳細(紹介+長所と短所の比較+例)
DOM方式でxmlを生成します。
public static void DomCreateXml() throws Exception {
        // 1、    DocumentBuilderFactory   
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2、    DocumentBuilder  
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 3、      Document
        Document document = db.newDocument();
        //     
        Element songs = document.createElement("songs");
        //      (            )
        for (int i = 0; i < 5; i++) {
            //     
            Element song = document.createElement("song");
            Element name = document.createElement("name");
            //  name     
            //                                        
            name.setTextContent("   ");
            Element time = document.createElement("time");
            time.setTextContent("5:20");
            Element size = document.createElement("size");
            size.setTextContent("30m");
            //         
            song.appendChild(name);
            song.appendChild(time);
            song.appendChild(size);
            songs.appendChild(song);
        }
        //        
        document.appendChild(songs);

        //        demo/   
        //       TransformerFactory  
        TransformerFactory tff = TransformerFactory.newInstance();
        //    tff    Transformer
        Transformer tf = tff.newTransformer();
        // xml   
        tf.setOutputProperty(OutputKeys.INDENT, "yes");
        //          xml  
        tf.transform(new DOMSource(document), new StreamResult("demo/dom.xml"));

    }
DOMを使用してxmlを作成する時はDOM数の階層関係に注意しなければなりません。DOMはw 3 cの標準ですので、DOMは一定の汎用性を持っています。JavaScriptで動作します。上のコードと似ています。ここでは説明しないです。次にもう一度見てみましょう。
DOM方式解析xml:
      public static void DomParseXml() throws Exception {
        // 1、    DocumentBuilderFactory   
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2、    DocumentBuilder  
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 3、    db parse     xml  
        Document parse = db.parse(new FileInputStream("demo/dom.xml"));
        //     parse               ,    song  
        NodeList songs = parse.getElementsByTagName("song");
        for (int i = 0; i < songs.getLength(); i++) {
            //   item         
            Node song = songs.item(i);
            //   song    song         
            NamedNodeMap attributes = song.getAttributes();
            //          
            System.out.println(attributes.getLength());
            //     
            for (int j = 0; j < attributes.getLength(); j++) {
                //    song        
                Node item = attributes.item(j);
                //      
                System.out.println(item.getNodeName() + " = " + item.getNodeValue() + "");
            }
            //      
            NodeList childNodes = song.getChildNodes();
            //           
            System.out.println(childNodes.getLength());
            //          
            for (int k = 0; k < childNodes.getLength(); k++) {
                //          
                if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
                        System.out.println(childNodes.item(k).getNodeName() + " = " +   childNodes.item(k).getTextContent());
                }
            }
        }
    }
サブノードの値を取得する際には、get NodeVaue()の方法ではなく、get TextContantet()の方法が必要であり、もちろん、child Nodes.item(k).get First Child().get NodeValue()の方法を使用してノード値を取得することもできる。
SAX方式でXMLを生成する
public static void SAXCreateXml() throws Exception {
        //     xml  
        StreamResult streamResult = new StreamResult(new FileOutputStream("demo/sax.xml"));
        //     xml               xml   
        //   SAXTransformerFactory  
        SAXTransformerFactory tff = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
        //   tff  TransformerHandler  
        TransformerHandler handler = tff.newTransformerHandler();
        //    xml  
        handler.getTransformer().setOutputProperty(OutputKeys.INDENT, "yes");
        //   handler xml    
        handler.setResult(streamResult);

        //           xml        
        //     document  
        handler.startDocument();
        //       
        AttributesImpl attr = new AttributesImpl();
        //   
        handler.startElement("", "", "songs", attr);
        for (int i = 0; i < 5; i++) {
            //                       (            )
            String s1 = "   ",s2="4:30  ",s3="4 M";
            //        
            attr.clear();
            attr.addAttribute("", "", "id", "", "1");
            handler.startElement("", "", "song", attr);

            attr.clear();
            handler.startElement("", "", "name", attr);
            handler.characters(s1.toCharArray(), 0, s1.length());
            handler.endElement("", "", "name");

            attr.clear();
            handler.startElement("", "", "time", attr);
            handler.characters(s2.toCharArray(), 0, s2.length());
            handler.endElement("", "", "time");

            attr.clear();
            handler.startElement("", "", "size", attr);
            handler.characters(s3.toCharArray(), 0, s3.length());
            handler.endElement("", "", "size");

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

        //   
        handler.endElement("", "", "songs");
        handler.endDocument();
    }
ここで私が使っているのは自分で定義した文字列です。もちろん配列や集合を自分で定義することもできます。集合を定義する時は空かどうか判断して、空のポインタを報告しないでください。
SAX方式解析XML
メーン関数
public static ArrayList SAXParseXml() throws Exception {
        // 1、    SAXParserFactory  
        SAXParserFactory factory = SAXParserFactory.newInstance();
        // 2、  factory   SAXParser  
        SAXParser parser = factory.newSAXParser();
        // 3、parse    parse    xml  
        //          DefaultHandler
        SAXHandler saxHandler = new SAXHandler();
        parser.parse(new FileInputStream("demo/songs.xml"), saxHandler);
        //     list   
        System.out.println(saxHandler.getList().size());
        List list = saxHandler.getList();
        for (Song s : list) {
            System.out.println(s.getId());
            System.out.println(s.getName());
            System.out.println(s.getTime());
            System.out.println(s.getSize());
        }
        return (ArrayList) saxHandler.getList();
    }
SAXHandler類:
public class SAXHandler extends DefaultHandler {

    private List list ;
    private Song song = null;
    private String string = null;

    //   getList     
    public List getList() {
        return list;
    }

    public SAXHandler() {
        this.list =new ArrayList();
    }

    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        System.out.println("    ");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        super.startElement(uri, localName, qName, attributes);
        if (qName.equals("song")) {
            //      song   
            song = new Song();
            //   song
            for (int i = 0; i < attributes.getLength(); i++) {
                System.out.println(attributes.getQName(i) + " = " + attributes.getValue(i));
                System.out.println("
=========================="
); // id if (attributes.getQName(i).equals("id")) { song.setId(attributes.getValue(i)); } } } else if (!qName.equals("song") && !qName.equals("songs")) { System.out.println(" :" + qName); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); // endElement string = new String(ch, start, length); // if (!string.trim().equals("")) { System.out.println(" :" + string + "
"
); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); if (qName.equals("song")) { System.out.println("============= ==============="); // list.add(song); // song song = null; } else if (qName.equals("name")) { song.setName(string); } else if (qName.equals("time")) { song.setTime(string); } else if (qName.equals("size")) { song.setSize(string); } } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println(" "); } }
エンティティクラスSong:
package com.entity;

public class Song {

    private String id;
    private String name;
    private String time;
    private String size;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }
}
上の操作:解析xmlドキュメント->を集合に保存します。出力は集合に保存しないで直接出力してもいいです。直接にエンティティ類と集合に関するコードを削除してもいいです。ただ、私たちは普通に値を保存してから取り出します。ある程度の普遍性を感じますので、集合に保存した例を貼り付けました。SAX方法は実はこの4つの方法の中で解析速度が一番速いです。間違いなく中小型のxmlデータの中ではdom 4 jよりも速いです。大きなデータの中ではdom 4 jが一番いいです。冒頭のブログを見ても分かります。SAXにもいくつかの欠点があります。ここでは詳しく説明しません。
DOM 4 J方式でXMLドキュメントを作成します。
public static void DOM4JCreateXML() throws Exception {
        //1、  document   
        Document document = DocumentHelper.createDocument();
        //2、     
        Element rootElement = document.addElement("songs");
        //3、       
        Element song = rootElement.addElement("song");

        Element name = song.addElement("name");
        name.setText("       ");
        Element time = song.addElement("time");
        time.setText("5:20");
        Element size = song.addElement("size");
        size.setText("10M");
        //4、  xml  
        XMLWriter xmlWriter = new XMLWriter(
                new FileOutputStream("demo/dom4j.xml"),
                //    
                OutputFormat.createPrettyPrint()
                );
        //     
        xmlWriter.write(document);
        //  xmlWriter
        xmlWriter.close();
    }
特に要求がないなら、みんなDOM 4 Jを使ったほうがいいと思います。コード量が少なくて、作成したxml文書も美しいです。また、DOM 4 Jは多くの複雑なxml文書をサポートしています。まだ使ったことがありません。知っているなら、私に言ってもいいです。大歓迎です。
DOM 4 J方式解析XMLドキュメント
//   SAXReader  
        SAXReader saxReader = new SAXReader();
        //   books.xml      document  
        Document document = saxReader.read(new InputStreamReader(new  FileInputStream("demo/dom4j.xml"), "utf-8"));
        //  document     
        Element rootElement = document.getRootElement();
        //          
        Iterator elementIterator = rootElement.elementIterator();
        while (elementIterator.hasNext()) {
            Element song = (Element) elementIterator.next();
            //  book        
            List attributes = song.attributes();
            for (Attribute attr : attributes) {
                System.out.println(attr.getName()+" = "+attr.getValue());
            }

            // song              
            Iterator elementIterator2 = song.elementIterator();
            while (elementIterator2.hasNext()) {
                Element songChild = (Element) elementIterator2.next();
                System.out.println("   :"+songChild.getName()+"  "+songChild.getStringValue());
            }
        }
    }
ここではXMLドキュメントを解析するための3つの方法を紹介します。JDOMでは、使用する必要がないと思います。完全にDOM 4 Jで代替できます。また、DOMでは大きなファイルに遭遇してもうまく処理できないので、SAX方式とDOM 4 J方式でXMLドキュメントを解析して生成することをおすすめします。最も重要な点は、もう少しで見落としてしまいました。DOM方式とSAXはJAVAで持参したものです。余分なJARカバンを導入する必要はありません。JDOMとDOM 4は全部追加のJARカバンを導入する必要があります。