java读取XML的四种方法

来源:互联网 发布:尼龙网眼布淘宝 编辑:程序博客网 时间:2024/05/19 20:59

首先理解XML的含义:
W3CSchool的解释是:

                    XML 指可扩展标记语言(EXtensible Markup Language)                    XML 是一种标记语言,很类似 HTML                    XML 的设计宗旨是传输数据,而非显示数据                    XML 标签没有被预定义。您需要自行定义标签。                    XML 被设计为具有自我描述性。                    XML 是 W3C 的推荐标准

具体可参阅w3shcool官方网站文档http://w3school.com.cn/index.html
具体可参阅w3c官方网站文档http://www.w3.org获取更多信息。

以以下的xml文件为例:

<?xml version="1.0" encoding="UTF-8"?><bookstore>    <book id="1" name="徐杰">        <name>冰与火之歌</name>        <author>乔治马丁</author>        <year>2014</year>        <price>89</price>    </book>    <book id="2">        <name>安徒生童话</name>        <year>2004</year>        <price>77</price>        <language>English</language>    </book></bookstore>

DOM方法:

       准备工作:
  1. 创建一个documentBuilder工厂类,用domumentBuilder类获得:

     DocumentBuilder db=dbf.newDocumentBuilder();
  2. 创建一个document对象并用parse方法加载books.xml

      Document document=db.parse("books.xml");

现在可以开始写具体的代码了:

   //用NodeList获取books的属性名称NodeList bookList=document.getElementsByTagName("book");//输出book的属性数字System.out.println("book的总共属性个数是:"+bookList.getLength());    for(int i=0;i<bookList.getLength();i++){System.out.println("===========开始第"+(i+1)+"次循环============");       //当不知道xml中属性的个数与属性的名字时用该方法Node book=bookList.item(i);NamedNodeMap arrs=book.getAttributes();System.out.println("第"+(i+1)+"本书共有 "+arrs.getLength()+"个属性值");    for(int j=0;j<arrs.getLength();j++){        Node arr=arrs.item(j);        System.out.print("属性名:"+arr.getNodeName());        System.out.println("--属性值:"+arr.getNodeValue());                        }//方法前提:已经知道book节点有且只有一个属性值  Element book=(Element) bookList.item(i);//强制类型转换时因为   element有个getAttribute方法  String attrValue=book.getAttribute("id");  System.out.println("id属性值为"+attrValue);  NodeList childNodes=book.getChildNodes();  System.out.println("第"+(i+1)+"本书一共有"+childNodes.getLength()+"个子节点");    for(int k=0;k<childNodes.getLength();k++){                              if(childNodes.item(k).getNodeType()==Node.ELEMENT_NODE){            System.out.print("第"+(k+1)+"个节点名:"+childNodes.item(k).getNodeName()+"---");//第一种方法                                //System.out.println(childNodes.item(k).getFirstChild().getNodeValue());//第二种方法                 System.out.println(childNodes.item(k).getTextContent())                         }                       

SAX方法:

准备工作:
  1. 创建一个SAXParserHandler工厂类

     SAXParserFactory factory=SAXParserFactory.newInstance();

    2.//创建一个SAXParserHandler对象并用parse加载books.xml

    SAXParserHandler handler=new SAXParserHandler();
    parser.parse(“books.xml”, handler);

现在可以开始写具体的代码了:
与DOM方法不一样的是:SAX采取的是事件模型机制处理文件,其主函数的SAXSAXParserHandler对象要**申明并继承**DefaultHandler接口

    int bookindex=0;    String value=null;    book books=null;    private ArrayList<book> bookList=new ArrayList<book>();    public ArrayList<book> getBookList() {        return bookList;    }    /*     * 用来标志解析开始     * */    public void startDocument() throws SAXException {    // TODO 自动生成的方法存根        super.startDocument();        System.out.println("SAX解析开始");    }    /*     * 用来遍历xml文件的开始标签     * */        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {            // TODO 自动生成的方法存根            super.startElement(uri, localName, qName, attributes);             if(qName.equals("book")){                 books=new book();                 bookindex++;                 System.out.println("======第"+bookindex+"本书开始循环遍历===========");                //如果已知book的属性值名称和个数时            /*String value=attributes.getValue("id");                System.out.println(value);  */                 //如果不知book的属性值和个数时                 int num=attributes.getLength();                 for(int i=0;i<num;i++){                     System.out.print("第"+(i+1)+"个属性名称是:"+attributes.getQName(i)+"---");                     System.out.println("第"+(i+1)+"个属性值是:" +attributes.getValue(i));                     //System.out.println("第"+(i+1)+"个属性值是:" +attributes.getValue(attributes.getQName(i)));                     if(attributes.getQName(i).equals("id")){                         books.setId(attributes.getValue(i));                     }                 }              }             else if(!qName.equals("book") && !qName.equals("bookstore")){                 System.out.print("节点名:"+qName);             }}        /*         * 用来遍历xml文件的结束标签         * */        public void endElement(String uri, String localName, String qName) throws SAXException {        // TODO 自动生成的方法存根            super.endElement(uri, localName, qName);            if(qName.equals("book")){                bookList.add(books);                books=null;             System.out.println("======第"+bookindex+"本书结束循环遍历==========");        }            else if(qName.equals("name")){                books.setName(value);            }else if(qName.equals("author")){                books.setAuthor(value);            }else if(qName.equals("name")){                books.setYear("year");            }else if(qName.equals("name")){                books.setYear(value);            }else if(qName.equals("price")){                books.setPrice(value);            }else if(qName.equals("language")){                books.setLanguage(value);            }            }          //获取字符集内容        public void characters(char[] ch, int start, int length) throws SAXException {            // TODO 自动生成的方法存根            super.characters(ch, start, length);             value=new String(ch, start, length);            if(!value.trim().equals("")){                System.out.println("--"+value);            }        }        /*         * 用来标志解析结束         * */        public void endDocument() throws SAXException {        // TODO 自动生成的方法存根            super.endDocument();            System.out.println("SAX解析结束");        }

JDOM方法:需要用额外的JDOM包

public class JDOMTest {    private  static ArrayList<book> bookList=new ArrayList<book>();    public static void main(String[] args) {        // 创建一个Saxbuilder对象        SAXBuilder saxbuilder=new SAXBuilder();        InputStream in;        try {            //创建一个输入流,将xml文件加载到输入流中          in=new FileInputStream("src/res/books.xml");          //通过saxbuilder中的build方法将输入流加载到saxbuilderz中            Document document=saxbuilder.build(in);            //通过document对象获取xml文件的根节点            Element rootElment= document.getRootElement();            List<Element> bookList=rootElment.getChildren();            for (Element element : bookList) {                book bookEntity=new book();                System.out.println("开始遍历"+(bookList.indexOf(element)+1)+"本书");                List<Attribute> attribute= element.getAttributes();                //知道books.xml的属性名称是用getAttributeValue                //element.getAttributeValue("id");                //获取属性                for (Attribute attribute2 : attribute) {                    String attrname=attribute2.getName();                    String attrvalue=attribute2.getValue();                    System.out.println("属性名:"+attrname+"--属性值:"+attrvalue);                    if(attrname.equals("id")){                        bookEntity.setId(attrvalue);                    }                }                //获取节点值            List<Element> bookchild=element.getChildren();                for (Element element2 : bookchild) {                    System.out.println("节点名称是:"+element2.getName()+"--节点值:"+element2.getValue());                    if(element2.getName().equals("name")){                        bookEntity.setName(element2.getValue());                    }else if(element2.getName().equals("author")){                        bookEntity.setAuthor(element2.getValue());                    }else if(element2.getName().equals("year")){                        bookEntity.setYear(element2.getValue());                    }else if(element2.getName().equals("price")){                        bookEntity.setPrice(element2.getValue());                    }else if(element2.getName().equals("language")){                        bookEntity.setLanguage(element2.getValue());                    }                }                System.out.println("结束遍历"+(bookList.indexOf(element)+1)+"本书");                JDOMTest.bookList.add(bookEntity);                bookEntity=null;//              System.out.println(JDOMTest.bookList.size());//              System.out.println(JDOMTest.bookList.get(0).getName());//              System.out.println(JDOMTest.bookList.get(0).getAuthor());                for(int i=0;i<JDOMTest.bookList.size();i++){                    System.out.println(JDOMTest.bookList.get(i).getName());                }            }        } catch (FileNotFoundException e) {            // TODO 自动生成的 catch 块            e.printStackTrace();        }catch (JDOMException e) {            // TODO 自动生成的 catch 块            e.printStackTrace();        } catch (IOException e) {            // TODO 自动生成的 catch 块            e.printStackTrace();        }    }

DOM4J方法:需要额外的DOM4J包

public static void main(String[] args) {        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();        try {                //创建document工厂                DocumentBuilder db=dbf.newDocumentBuilder();                //创建一个documentbuilder类                Document document=db.parse("books.xml");                //获取属性值                NodeList bookList=document.getElementsByTagName("book");                //输出book的属性数字                System.out.println("book的总共属性个数是:"+bookList.getLength());                for(int i=0;i<bookList.getLength();i++){                    System.out.println("===========开始第"+(i+1)+"次循环============");                    //当不知道xml中属性的个数与属性的名字时用该方法                     Node book=bookList.item(i);                    NamedNodeMap arrs=book.getAttributes();                    System.out.println("第"+(i+1)+"本书共有 "+arrs.getLength()+"个属性值");                    for(int j=0;j<arrs.getLength();j++){                        Node arr=arrs.item(j);                        System.out.print("属性名:"+arr.getNodeName());                        System.out.println("--属性值:"+arr.getNodeValue());                        }                    //方法前提:已经知道book节点有且只有一个属性值//                  Element book=(Element) bookList.item(i);//强制类型转换时因为element有个getAttribute方法//                  String attrValue=book.getAttribute("id");//                  System.out.println("id属性值为"+attrValue);//                                      NodeList childNodes=book.getChildNodes();                    System.out.println("第"+(i+1)+"本书一共有"+childNodes.getLength()+"个子节点");                    for(int k=0;k<childNodes.getLength();k++){                        if(childNodes.item(k).getNodeType()==Node.ELEMENT_NODE){                            System.out.print("第"+(k+1)+"个节点名:"+childNodes.item(k).getNodeName()+"---");                            //第一种方法                            //System.out.println(childNodes.item(k).getFirstChild().getNodeValue());                            //第二种方法                            System.out.println(childNodes.item(k).getTextContent());                        }                    }                    System.out.println("===========结束第"+(i+1)+"次循环============");                    System.out.println();                }        } catch (ParserConfigurationException e) {            e.printStackTrace();        }catch (SAXException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }
0 0
原创粉丝点击