XML语法和解析

概述

XML中文名可扩展标记语言,可理解为软件与软件之间互通消息的语言,具有平台无关性。目前主要用于配置文件,与JSON相比具有可读性高的优点,但解析速度远不如JSON,因此只在某些配置文件中使用。

XML文档结构

与HTML一样,XML文档结构由标签组成,标签也可称之为标记、元素、节点。标签与标签之间的关系可以包含、嵌套。

一个标签的基本语法格式为:

<开始标记名>标记内容</结束标记名>

文档结构注意事项

  1. 一个xml文档中,有且仅有一个根标记(就是说最外边的标记只有一个)
  2. 标记可以嵌套,不许交叉
  3. 标记中包含属性,属性写在开始标签中,由属性名和属性值组成,属性名不许重复,属性值必须用双引号包裹,多个属性间用空格隔开,属性值与属性名之间用"="连接
  4. 注释:注释不能写在文档声明前

注释格式:

<!--注释内容 -->

自定义标签名称注意事项:

  1. 不能包含"xml"的大写和小写形式。
  2. 不能以数字开头,
  3. 不能包含":"或空格
  4. 区分大小写

CDATA

CDATA不会被解析器解析,脚本代码经常写入XML中的CDATA中

CDATA格式:

<![CDATA[...脚本代码...]]>

DOM4j解析XML文件基本流程

  1. 引入jar文件dom4j.jar

  2. 创建一个XML文件的输入流

FileInputStream fis = new FileInputStream("XML文件地址");//本地
//2.1 创建URL对象
URL url= new URL("网址");
//2.2 调用URL对象的openConnection()得到URLConnection对象
URLConnection conn = url.openConnection();
//2.3 通过URLConnection对象调用getInputStream()得到输入流对象
InputStream is = conn.getInputStream();//网络
  1. 创建一个XML读取工具对象
SAXReader sr= new SAXReader();
  1. 使用读取工具对象读取文档输入流,得到文档对象
Document doc = sr.read(fis);
  1. 通过文档对象得到XML中的根元素对象
Element root = doc.getRootElement();
  1. 关闭流
fis.close();

DOM4j操作XML文件节点常用方法

方法 描述
String getName() 获取节点名称
String getText() 获取节点内容
String setText() 设置节点内容
Element element(String 子节点名称) 根据子节点名称,获取匹配的第一个子节点对象
List elements() 获取所有子节点对象
String attributeVaule(String 属性名称) 获取节点的属性值
String elementText(String 子节点名称) 获取子节点的内容
Element addElement(String 子结点名称) 添加子节点
void addAttribute(String 属性名,String 属性值) 添加属性
注意:具有父子节点关系的对象调用才能获得对应子结点的数据

读取XML文件案例(本地)

    public static void main(String[] args) throws IOException, DocumentException {
        //1.引入dom4j.jar
        //2.创建xml文件输入流
        FileInputStream fis = new FileInputStream("D://Demo1.xml");
        //3.创建读取工具对象SAXReader
        SAXReader sr = new SAXReader();
        //4.读取输入流得到Document对象
        Document doc = sr.read(fis);
        //5.根据文档对象得到根节点
        Element root = doc.getRootElement();

        List<Element> es = root.elements();

        for (Element e :
                es) {
            System.out.println(e.attributeValue("id"));
            System.out.println(e.elementText("name"));
            System.out.println(e.elementText("info"));
        }
        fis.close();

    }

读取XML文件(网络文件)

XML格式信息:

    public static void main(String[] args) throws IOException, DocumentException {
        String phone = "18516955565";
        //获得XML资源拿到输入流
        URL url= new URL("http://apis.juhe.cn/mobile/get?phone="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
        URLConnection conn = url.openConnection();
        InputStream is = conn.getInputStream();
        //创建读取对象
        SAXReader sr = new SAXReader();
        //通过读取对象读取XML数据并返回文档对象
        Document doc = sr.read(is);
        //获取根节点
        Element root = doc.getRootElement();
        //解析内容
        String code = root.elementText("resultcode");
        if ("200".equals(code)) {
            Element result = root.element("result");
            String province = result.elementText("province");
            String city = result.elementText("city");
            if (province.equals(city)){
                System.out.println("手机号码归属地为:"+city);
            }else{
                System.out.println("手机号归属地为:"+province+" "+city);
            }
        }else {
            System.out.println("手机号不正确");
        }

    }

XPath解析XML

与dom4j流程只有第一步不同,除了引入dom4j.jar外,还要引入jaxen1.1-bete-7.jar

路径表达式语法

方法 说明
/ 从根节点开始查找
// 从发起查找的节点位置开始查找后代节点
. 查找当前节点
.. 查找父节点
[@属性名='值'] 查找对应属性
[@属性名<'值'] 查找对应属性
[@属性名>'值'] 查找对应属性
[@属性名!='值'] 查找对应属性

使用Document对象调用的方法

方法 说明
Element selectSingleNode("路径表达式") 查找单个节点
List selectNodes("路径表达式") 查找多个节点

使用XPath解析案例

    public static void main(String[] args) throws IOException, DocumentException {
        //1.引入dom4j.jar,jaxen-1.1-beta-7.jar
        //2.创建xml文件输入流
        FileInputStream fis = new FileInputStream("D://Demo1.xml");
        //3.创建读取工具对象SAXReader
        SAXReader sr = new SAXReader();
        //4.读取输入流得到Document对象
        Document doc = sr.read(fis);
        //5.根据文档对象得到根节点
        //Element root = doc.getRootElement();

      //单节点路径表达式查询
        /*
        "//父节点名[@属性名='属性值']//子节点名"
         */
        System.out.println(doc.selectSingleNode("//book[@id='1001']//info").getText());
        System.out.println(doc.selectSingleNode("//name").getText());

      //多节点路径表达式查询
        List<Element> list = doc.selectNodes("//book");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).elementText("name"));
            System.out.println(list.get(i).elementText("info"));
            System.out.println("------");
        }
        fis.close();

    }

java对象生成XML文件

基本流程如下:

  1. 引入dom4j.jar
  2. 通过文档帮助器创建文档对象
Document doc  = DocumentHelper.createDocument();
  1. 向文档对象中加入根节点
Element root = doc.addElement("节点名称");
  1. 向根节点中加入子节点
doc.setAttribute("属性名称","属性值");
[Element e] = doc.addElement("节点名称").setText("节点值");
  1. 创建文件输出流对象
FileOutputStream fos = new FileOutputStream();
  1. 将文件输出流对象转换为XML输出流对象
XMLWriter xw  = new XMLWriter(fos);
  1. 将文档对象写出
xw.write(doc);

8.关闭流

xw.close();
fos.close();

Java对象输出XML文件格式案例

    public static void main(String[] args) throws IOException{
        //1.引入Dom4j.jar
        //2.通过文档帮助器创建文档对象
        Document doc = DocumentHelper.createDocument();
        //3.文档对象中加入根节点
        Element root = doc.addElement("books");
        //4.根节点中加入子结点
        Element book = root.addElement("book");
        book.addAttribute("id","1001");
        book.addElement("name").setText("金苹果");

        book.addElement("info").setText("金苹果info");

        Element book2 = root.addElement("book");
        book2.addAttribute("id","1002");
        book2.addElement("name").setText("银平果");
        book2.addElement("info").setText("银平果info");

        //5.创建文件输出流对象
        FileOutputStream fos = new FileOutputStream("D://Demo3.xml");
        //6.将文件输出流转化问XML输出流
        XMLWriter xw = new XMLWriter(fos);
        //7.将文档对象输出
        xw.write(doc);

        //8.关闭流
        xw.close();
        fos.close();

    }
posted on 2022-01-07 22:03  技术小伙伴  阅读(508)  评论(0)    收藏  举报