26.Java2核心技术—读xml文件的两种方法

XMl:可扩展标记语言。xml文档大小写敏感,结束标签绝对不能省略,但可以这样即只有一个标签而没有相对应的结束标签的元素必须以 / 结尾,属性值必须用引号括

        起来且属性值必须都有值。如下面的user.xml:

        <?xml version="1.0" ?>
            <users>
                 <user>
                     <name>Jack</name>
                     <gender>male</gender>
                     <age>90</age>
                     <height>182</height>
                     <weight>200</weight>
                 </user>
                 <user>
                     <name>Mike</name>
                     <gender>male</gender>
                     <age>29</age>
                     <height>175</height>
                     <weight>120</weight>
                 </user>
             </users>

  我们要处理xml文档就要解析xml文档,Java库提供了两种方法解析xml文档:

1.DOM(Document Object Model):文档对象模型,将读入的xml文档转换成树形结构,但是需要消耗大量内存。

  实例代码:解析上面的user.xml

       public static void main(String[] args)throws Exception {

             DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                                                   .newDocumentBuilder();
             Document doc = builder.parse(new File("user.xml"));
             Element root = doc.getDocumentElement();//返回跟元素即Users
             NodeList list = root.getElementsByTagName("user");//返回跟元素下的所有名为user的子元素的节点列表
             List<User> users = new ArrayList();
             for(int i=0;i<list.getLength();i++){
                 Element user = (Element)list.item(i);
                 users.add(parseUser(user));
             }
             System.out.println(users.iterator().next().getName());
       }
       private static User parseUser(Element user){//解析子元素user下的子元素的内容
             User u = null;
             Element name = (Element)user.getElementsByTagName("name").item(0);
      Element gender = (Element)user.getElementsByTagName("gender").item(0);
             Element age = (Element)user.getElementsByTagName("age").item(0);
      Element height = (Element)user.getElementsByTagName("height").item(0);
      Element weight = (Element)user.getElementsByTagName("weight").item(0);
      u = new User(name.getTextContent(),
          gender.getTextContent(),
          JdbcUtil.toInt(age.getTextContent().trim()),
          JdbcUtil.toInt(height.getTextContent().trim()),
          JdbcUtil.toInt(weight.getTextContent().trim()));
      return u;
   }

       public static Integer toInt(String num){
        Integer i = null;
        try{
            i = Integer.parseInt(num);
        }catch(Exception e){
             e.printStackTrace();
        }
        return i;
    }

2.SAX(Simple API for XML)用于XML的简单API:SAX解析器在解析xml输入的构件时就报告事件,但不会以任何方式存储文档。使用SAX解析器时,需要一个处理器

                                                                 来定义不同的解析器事件的事件动作。

   实例代码:解析上面的user.xml文件

       public static void main(String[] args)throws Exception {
         SAXParser parser = SAXParserFactory.newInstance()
                               .newSAXParser();
         InputStream in = new FileInputStream("user.xml");
         parser.parse(in, new MySAXHandler());
         in.close();
   }

    -------------------------处理器------------------------------

  public class MySAXHandler extends DefaultHandler {
     @Override
     public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {
         StringBuffer sb = new StringBuffer();
         sb.append("<" + qName);
         if (attributes.getLength() != 0) {//处理元素属性
          for (int i = 0; i < attributes.getLength(); i++) {
            sb.append(" " + attributes.getLocalName(i) + "=");
            sb.append(attributes.getValue(i));
          }
        }
          sb.append(">");
         System.out.print(sb.toString());
      }

      @Override
      public void characters(char[] ch,  int start, int length) throws SAXException {//处理文本内容
        String s = new String(ch,start,length);
        System.out.print(s);
      }

      @Override
      public void endElement(String uri, String localName, String qName)throws SAXException {
        System.out.print("<" + qName+">");
      }

      @Override
      public void startDocument() throws SAXException {
        System.out.println("-----文档开始-----");
      }

     @Override
      public void endDocument() throws SAXException {
        System.out.println("\n-----文档结束-----");
      }
   }

posted on 2012-05-04 18:05  ssy黑桃a  阅读(203)  评论(0编辑  收藏  举报