How to read and write xml files?

前端 未结 6 520
庸人自扰
庸人自扰 2020-11-22 09:03

I have to read and write to and from an XML file. What is the easiest way to read and write XML files using Java?

6条回答
  •  悲哀的现实
    2020-11-22 09:43

    Here is a quick DOM example that shows how to read and write a simple xml file with its dtd:

    
    
    
        User
        Author
        Admin
        
    
    

    and the dtd:

    
    
    
    
    
    
    

    First import these:

    import javax.xml.parsers.*;
    import javax.xml.transform.*;
    import javax.xml.transform.dom.*;
    import javax.xml.transform.stream.*;
    import org.xml.sax.*;
    import org.w3c.dom.*;
    

    Here are a few variables you will need:

    private String role1 = null;
    private String role2 = null;
    private String role3 = null;
    private String role4 = null;
    private ArrayList rolev;
    

    Here is a reader (String xml is the name of your xml file):

    public boolean readXML(String xml) {
            rolev = new ArrayList();
            Document dom;
            // Make an  instance of the DocumentBuilderFactory
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            try {
                // use the factory to take an instance of the document builder
                DocumentBuilder db = dbf.newDocumentBuilder();
                // parse using the builder to get the DOM mapping of the    
                // XML file
                dom = db.parse(xml);
    
                Element doc = dom.getDocumentElement();
    
                role1 = getTextValue(role1, doc, "role1");
                if (role1 != null) {
                    if (!role1.isEmpty())
                        rolev.add(role1);
                }
                role2 = getTextValue(role2, doc, "role2");
                if (role2 != null) {
                    if (!role2.isEmpty())
                        rolev.add(role2);
                }
                role3 = getTextValue(role3, doc, "role3");
                if (role3 != null) {
                    if (!role3.isEmpty())
                        rolev.add(role3);
                }
                role4 = getTextValue(role4, doc, "role4");
                if ( role4 != null) {
                    if (!role4.isEmpty())
                        rolev.add(role4);
                }
                return true;
    
            } catch (ParserConfigurationException pce) {
                System.out.println(pce.getMessage());
            } catch (SAXException se) {
                System.out.println(se.getMessage());
            } catch (IOException ioe) {
                System.err.println(ioe.getMessage());
            }
    
            return false;
        }
    

    And here a writer:

    public void saveToXML(String xml) {
        Document dom;
        Element e = null;
    
        // instance of a DocumentBuilderFactory
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            // use factory to get an instance of document builder
            DocumentBuilder db = dbf.newDocumentBuilder();
            // create instance of DOM
            dom = db.newDocument();
    
            // create the root element
            Element rootEle = dom.createElement("roles");
    
            // create data elements and place them under root
            e = dom.createElement("role1");
            e.appendChild(dom.createTextNode(role1));
            rootEle.appendChild(e);
    
            e = dom.createElement("role2");
            e.appendChild(dom.createTextNode(role2));
            rootEle.appendChild(e);
    
            e = dom.createElement("role3");
            e.appendChild(dom.createTextNode(role3));
            rootEle.appendChild(e);
    
            e = dom.createElement("role4");
            e.appendChild(dom.createTextNode(role4));
            rootEle.appendChild(e);
    
            dom.appendChild(rootEle);
    
            try {
                Transformer tr = TransformerFactory.newInstance().newTransformer();
                tr.setOutputProperty(OutputKeys.INDENT, "yes");
                tr.setOutputProperty(OutputKeys.METHOD, "xml");
                tr.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
                tr.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "roles.dtd");
                tr.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
    
                // send DOM to file
                tr.transform(new DOMSource(dom), 
                                     new StreamResult(new FileOutputStream(xml)));
    
            } catch (TransformerException te) {
                System.out.println(te.getMessage());
            } catch (IOException ioe) {
                System.out.println(ioe.getMessage());
            }
        } catch (ParserConfigurationException pce) {
            System.out.println("UsersXML: Error trying to instantiate DocumentBuilder " + pce);
        }
    }
    

    getTextValue is here:

    private String getTextValue(String def, Element doc, String tag) {
        String value = def;
        NodeList nl;
        nl = doc.getElementsByTagName(tag);
        if (nl.getLength() > 0 && nl.item(0).hasChildNodes()) {
            value = nl.item(0).getFirstChild().getNodeValue();
        }
        return value;
    }
    

    Add a few accessors and mutators and you are done!

提交回复
热议问题