轻松读取XML文件的方法

时间:2015-04-30 07:33:33

标签: android xml parsing

我有一个像这样的XML文件

<persons>
<person>
<name>Joe</name>
<age>44</age>
</person>
</persons>

我想知道一种简单的方法来阅读它。 我用我的代码

创建了这个xml文件
XmlSerializer serializador = Xml.newSerializer();

try{
    FileOutputStream file= openFileOutput("ff.xml",MODE_PRIVATE);
    serializador.setOutput(ff, "UTF-8");

    serializador.startDocument("UTF-8", true);
    serializador.startTag("", "persons");

    serializador.startTag("","person");
    serializador.text("joe");
    serializador.endTag("","person");

    serializador.startTag("","age");
    serializador.text("44");
    serializador.endTag("","age");

    serializador.endTag("", "persons");
    serializador.endDocument();

    Toast.makeText(this,"XML OK",Toast.LENGTH_SHORT).show();
}catch (Exception ex){
    txt1.setText(ex.toString());

}

现在我需要一个简单的方法来阅读它......以及如何在/myDir/here/ff.xml这样的路径中保存这个文件 不在data/data/my_app/files

3 个答案:

答案 0 :(得分:0)

您可以使用Simple框架。我之前使用过它,并且很有趣,这是一项很棒的工作。尝试一下,你不会后悔:)

答案 1 :(得分:0)

您可以使用XML Pull Parser或者也可以试用SAX Parser

,而不是手动阅读它

答案 2 :(得分:0)

基本上有两种读取XML文件的方法:

  1. 使用DOM接口,这意味着将整个文档对象模型读入内存。
  2. 使用SAX界面意味着在阅读时处理XML文件。 (适用于大文件)
  3. 如果你有一个XML文件,例如列出三个这样的员工:

    <?xml version="1.0" encoding="UTF-8"?>
    <Personnel>
       <Employee type="permanent">
            <Name>Seagull</Name>
            <Id>3674</Id>
            <Age>34</Age>
       </Employee>
      <Employee type="contract">
            <Name>Robin</Name>
            <Id>3675</Id>
            <Age>25</Age>
        </Employee>
      <Employee type="permanent">
            <Name>Crow</Name>
            <Id>3676</Id>
            <Age>28</Age>
        </Employee>
    </Personnel>
    

    您可以使用以下代码将其读入相应的Employee类:

    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    
    public class DomParserExample {
    
        //No generics
        List myEmpls;
        Document dom;
    
    
        public DomParserExample(){
            //create a list to hold the employee objects
            myEmpls = new ArrayList();
        }
    
        public void runExample() {
    
            //parse the xml file and get the dom object
            parseXmlFile();
    
            //get each employee element and create a Employee object
            parseDocument();
    
            //Iterate through the list and print the data
            printData();
    
        }
    
    
        /* (1) Get a document builder using document builder factory and 
         * parse the xml file to create a DOM object
         */
        private void parseXmlFile(){
            //get the factory
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    
            try {
    
                //Using factory get an instance of document builder
                DocumentBuilder db = dbf.newDocumentBuilder();
    
                //parse using builder to get DOM representation of the XML file
                dom = db.parse("employees.xml");
    
    
            }catch(ParserConfigurationException pce) {
                pce.printStackTrace();
            }catch(SAXException se) {
                se.printStackTrace();
            }catch(IOException ioe) {
                ioe.printStackTrace();
            }
        }
    
        /* (2) Get a list of employee elements:
         *  Get the rootElement from the DOM object.
         *  From the root element get all employee elements. 
         *  Iterate through each employee element to load the data.
         */     
        private void parseDocument(){
            //get the root elememt
            Element docEle = dom.getDocumentElement();
    
            //get a nodelist of <employee> elements
            NodeList nl = docEle.getElementsByTagName("Employee");
    
            if(nl != null && nl.getLength() > 0) {
                for(int i = 0 ; i < nl.getLength();i++) {
    
                    //get the employee element
                    Element el = (Element)nl.item(i);
    
                    //get the Employee object
                    Employee e = getEmployee(el);
    
                    //add it to list
                    myEmpls.add(e);
                }
            }
        }
    
    
        /**
         * (3)For each employee element get the id,name,age and type. 
         * Create an employee value object and add it to the list.
         *  I take an employee element and read the values in, create
         * an Employee object and return it
         * @param empEl
         * @return
         */
        private Employee getEmployee(Element empEl) {
    
            //for each <employee> element get text or int values of 
            //name ,id, age and type
            String name = getTextValue(empEl,"Name");
            int id = getIntValue(empEl,"Id");
            int age = getIntValue(empEl,"Age");
    
            String type = empEl.getAttribute("type");
    
            //Create a new Employee with the value read from the xml nodes
            Employee e = new Employee(name,id,age,type);
    
            return e;
        }
    
    
        /**
         * I take a xml element and the tag name, look for the tag and get
         * the text content 
         * i.e for <employee><name>John</name></employee> xml snippet if
         * the Element points to employee node and tagName is name I will return John  
         * @param ele
         * @param tagName
         * @return
         */
        private String getTextValue(Element ele, String tagName) {
            String textVal = null;
            NodeList nl = ele.getElementsByTagName(tagName);
            if(nl != null && nl.getLength() > 0) {
                Element el = (Element)nl.item(0);
                textVal = el.getFirstChild().getNodeValue();
            }
    
            return textVal;
        }
    
    
        /**
         * Calls getTextValue and returns a int value
         * @param ele
         * @param tagName
         * @return
         */
        private int getIntValue(Element ele, String tagName) {
            //in production application you would catch the exception
            return Integer.parseInt(getTextValue(ele,tagName));
        }
    
        /**
         * Iterate through the list and print the 
         * content to console
         */
        private void printData(){
    
            System.out.println("No of Employees '" + myEmpls.size() + "'.");
    
            Iterator it = myEmpls.iterator();
            while(it.hasNext()) {
                System.out.println(it.next().toString());
            }
        }
    
    
        public static void main(String[] args){
            //create an instance
            DomParserExample dpe = new DomParserExample();
    
            //call run example
            dpe.runExample();
        }
    
    }