Java中的XML文件解析

来源:互联网 发布:mac搜狗五笔组词 编辑:程序博客网 时间:2024/05/23 20:36

XML

  • 可扩展标记语言(Extensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。


什么是可扩展标记语言?

  • 可扩展标记语言是一种很像超文本标记语言的标记语言。
  • 它的设计宗旨是传输数据,而不是显示数据。
  • 它的标签没有被预定义。您需要自行定义标签。
  • 它被设计为具有自我描述性。
  • 它是W3C的推荐标准。


可扩展标记语言和超文本标记语言之间的差异

  • 它不是超文本标记语言的替代。
  • 它是对超文本标记语言的补充。
  • 它和超文本标记语言为不同的目的而设计

Xml文档说明


xml声明 xml文档总是以一个xml声明开始,其中指明所用的xml版本、文档的编码、
文档的独立性信息。格式如下:

<?xml version=“1.0” encoding=“UTF-8”?>


DTD:文档类型定义

<!DOCTYPE greeting[  <!ELEMENT greeting(#PCDATA)>>


元素:

  • xml中,元素由开始标签、元素内容和结束标签构成,对于空元素,由空元素标签构成。每个元素都有一个用名字标识的类型,同时它可以有一个属性说明集,每一个属性说明有一个名字和一个值。


元素的四种形式:

空元素:<student/>带属性的空元素:<student name=”jason" age="10"/>带内容的元素:<student > test</student>带有内容和属性的元素:<student name=”jason”> test</student>



解析xml的几种方式


1:DOM

  • Document Object Module:文档对象模型
  • 特点:一次加载到内存中,占用大量内存
  • 常用类库:DOM, JDOM ,DOM4j


2:SAX

  • Simple API for XMl基于事件的xml简单API
  • 特点:事件驱动模型,按顺序读取xml,占用内存少,速度快
  • 常用类库: JAXP


创建一个xml文件作为测试

<?xml version="1.0" encoding="UTF-8" ?><students>    <student idcard="41272400000000">        <name>Lingdu</name>        <sex>boy</sex>    </student>    <student idcard="44192400000000">        <name>alice</name>        <sex>girl</sex>    </student></students>


创建一个Student类作为测试

/** * 测试类 * @author Administrator */public class Student {    String idcard;    String name;    String sex;    public String getIdcard() {        return idcard;    }    public void setIdcard(String idcard) {        this.idcard = idcard;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public Student(String idcard, String name, String sex) {        super();        this.idcard = idcard;        this.name = name;        this.sex = sex;    }    public Student() {        super();    }}

DOM解析XML


要使用Dom必须导入 软件包:javax.xml.parsers

1



DocumentBuilder类


构造方法:

protected  DocumentBuilder() //受保护的构造方法


常用方法:

Document parse(File f) //将给定文件的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。abstract  Document parse(InputSource is) //将给定输入源的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。Document parse(InputStream is) //将给定 InputStream 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。Document parse(InputStream is, String systemId) //将给定 InputStream 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。Document parse(String uri) //将给定 URI 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象。


DocumentBuilderFactory类


构造方法:

protected  DocumentBuilderFactory() //用于阻止实例化的受保护构造方法。


常用方法:

static DocumentBuilderFactory  newInstance() //获取 DocumentBuilderFactory 的新实例。


软件包 org.w3c.dom

为文档对象模型 (DOM) 提供接口,该模型是 Java API for XML Processing 的组件 API。

2

3



获取元素信息的类
org.w3c.dom.Document


常用方法:

Element getDocumentElement() //这是一种便捷属性,该属性允许直接访问文档的文档元素的子节点。NodeList getElementsByTagName(String tagname) //按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList。String getTagName() //元素的名称。String getAttribute(String name)  //通过名称获得属性值。


实例

    /**     * 获取一个student集合     */    public static List<Student> getStudentList(){        //用来保存student集合        List<Student> studentList = new ArrayList<Student>();        try {            //创建一个文档工厂解析'src/students.xml'            Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("src/students.xml");            //通过标签名获取元素,返回一个NodeList集合            NodeList nodeList = doc.getElementsByTagName("student");            for (int i = 0; i < nodeList.getLength(); i++) {                //第一次循环的时候,取出的第一个student,第二次取的是第二个student                //获取属性idcard                Node node = nodeList.item(i);                //getAttribute(String name)通过名称获得属性值。                NamedNodeMap nnm = node.getAttributes();                //获取指定名称项                Node attrNode = nnm.getNamedItem("idcard");                //获取value值                String idcard = attrNode.getNodeValue();                //创建一个Student对象                Student student = new Student();                //将获取到的idcard设置进去                student.setIdcard(idcard);                //获取子元素的内容                NodeList childNodeList = nodeList.item(i).getChildNodes();//这里获取到第一个student                for (int j = 0; j < childNodeList.getLength(); j++) {                    String name = childNodeList.item(j).getNodeName();                    String value = childNodeList.item(j).getTextContent();                    //System.out.println("--->" + name + "----->" + value);                    if(childNodeList.item(j).getNodeName().equals("name")){                        //value就是我们要的xml里面的姓名的内容                        student.setName(value);                    }                    if(childNodeList.item(j).getNodeName().equals("sex")){                        //value就是我们要的xml里面的性别的内容                        student.setSex(value);                    }                }                studentList.add(student);            }        } catch (SAXException | IOException | ParserConfigurationException e) {            e.printStackTrace();        }        return studentList;    }

4


JDOM解析XML


官网地址:

www.jdom.org


在线API文档

http://www.jdom.org/docs/apidocs/index.html


Meven地址:

<!-- https://mvnrepository.com/artifact/jdom/jdom --><dependency>        <groupId>jdom</groupId>        <artifactId>jdom</artifactId>        <version>1.0</version></dependency>


实例

    /**     * 通过元素的属性获取到value     * @return     */    public static List<Student> getStudentList(){        List<Student> studentList = new ArrayList<Student>();        //创建一个解析器        SAXBuilder sb = new SAXBuilder();        try {            //获取到xml文档            Document doc = sb.build(new FileInputStream("src/students.xml"));            //获取跟元素            Element rootElement = doc.getRootElement();            //通过跟元素获取到相应的子元素,返回一个元素集合            List<?> elementList = rootElement.getChildren();            for (int i = 0; i < elementList.size(); i++) {                //拿到第i个元素                Element element = (Element) elementList.get(i);                //通过元素获取到名称                String studentName = element.getName();                //如果名称是student                if(studentName.equals("student")){                    //通过元素获取属性的值                    String idcard = element.getAttributeValue("idcard");                    //System.out.println(idcard);                    String name = element.getChildText("name");                    String sex = element.getChildText("sex");                    //System.out.println(idcard + "," + name + "," + sex);                    //创建一个Student对象,将信息添加进去                    Student student = new Student(idcard,name,sex);                    //最后添加到集合中                    studentList.add(student);                }            }        } catch (JDOMException | IOException e) {            e.printStackTrace();        }        //返回一个集合        return studentList;    }

5


DOM4J解析XML


官网地址:

http://www.dom4j.org/dom4j-1.6.1


在线API文档

http://tool.oschina.net/apidocs/apidoc?api=dom4j1.6.1%2Fapidocs


Maven地址

<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->        <dependency>            <groupId>dom4j</groupId>            <artifactId>dom4j</artifactId>            <version>1.6.1</version>        </dependency>


dom4J属性说明

Attribute               //定义了 XML 的属性。Branch                  //指能够包含子节点的节点。如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为CDATA                   //定义了 XML CDATA 区域CharacterData           //是一个标识接口,标识基于字符的节点。如CDATA,Comment, Text.Comment                 //定义了 XML 注释的行为Document                //定义了XML 文档DocumentType            //定义 XML DOCTYPE 声明Element                 //定义XML 元素ElementHandler          //定义了Element 对象的处理器ElementPath             //被 ElementHandler 使用,用于取得当前正在处理的路径层次信息Entity                  //定义 XML entityNode                    //为dom4j中所有的XML节点定义了多态行为NodeFilter                      //定义了在dom4j 节点中产生的一个滤镜或谓词的行为(predicate)ProcessingInstruction           //定义 XML 处理指令Text                            //定义 XML 文本节点Visitor                         //用于实现 Visitor模式XPath                           //在分析一个字符串后会提供一个 XPath 表达式


实例

/**     * 使用DOM4J解析XML文件     * @return     */    public static List<Student> getStudentList(){        List<Student> studentList = new ArrayList<Student>();        //创建SAX解析事件        SAXReader sax = new SAXReader();        try {            //读取XML文件返回一个文档对象            Document doc = sax.read(new FileInputStream("src/students.xml"));            //通过文档对象获取到跟元素            Element rootElement = doc.getRootElement();            //System.out.println(rootElement);            //通过跟元素获取到元素的迭代器            Iterator<?> it = rootElement.elementIterator();            //如果有下一条            while(it.hasNext()){                Element element = (Element) it.next();                //通过元素属性获取到内容                String idcard = element.attribute("idcard").getText();                //通过元素名称获取到文本                String name = element.elementText("name");                String sex = element.elementText("sex");                Student student = new Student(idcard,name,sex);//              System.out.println(element.attribute("idcard").getText());//              System.out.println(element.elementText("name"));//              System.out.println(element.elementText("sex"));                studentList.add(student);            }        } catch (FileNotFoundException | DocumentException e) {            e.printStackTrace();        }        return studentList;    }

6




SAX解析XML

// 创建解析工厂  SAXParserFactory factory = SAXParserFactory.newInstance();  // 创建解析器  SAXParser parser = factory.newSAXParser();  // 得到读取器  XMLReader reader = parser.getXMLReader();  // 设置内容处理器  BeanListHandler handler = new BeanListHandler();  reader.setContentHandler(handler);  // 读取xml文档  reader.parse("src/students.xml");  ArrayList<Student> list = handler.getStudent();          Student student;          for(int i = 0; i < list.size(); i++) {              student = new Student();              student = (Student) list.get(i);              System.out.println(student.getIdcard()+","+student.getName()+","+student.getSex());         }  /** * 需要创建一个类继承DefaultHandler * @author Administrator */class BeanListHandler extends DefaultHandler{    ArrayList<Student> studentList = new ArrayList<Student>();    /**     * 开始     */    @Override    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {    }    @Override    public void characters(char[] ch, int start, int length) throws SAXException {    }    /**     * 结束     */    @Override    public void endElement(String uri, String localName, String qName) throws SAXException {    }    /**     * 创建一个方法用来过去集合     * @return     */    public ArrayList<Student> getStudent(){        return studentList;    }}

典型使用场景

  • 1:存放sql语句的配置文件

  • 2:存放系统配置的配置文件

  • 3:webservice与http接口传输数据

0 0
原创粉丝点击