• XML


    一概述

    1.什么是XML?

    eXtensible  Markup  Language,不以预先定义的一组数据结构为前提,用作应用程序间数据交换的载体。XML没有规定固定的标签与固定的结构,用户可以自定义,可扩展性强,这一点不同于HTML语言,HTML规定了可使用的标签以及标签之间的关系,扩展性差。

    2.XML的作用

    使用XML语言编写的文档主要用作应用程序间数据交换的载体,一个应用程序将传递给另一个应用程序的数据以XML语言编写,接收一方的应用程序根据XML语言的规则读取。

    3.XML文档的构成

    ⑴序言

    XML声明、处理指令与注释。

    ⑵文档元素

    • 文档元素一般指文档标签。
    • XML文档元素以树形分层结构排列。
    • XML文档中只能有一个顶层元素,这个顶层元素叫做根元素。
    • 文档元素必须有起始标记与结束标记,两种形式:<tagName>xxxxx</tagName与<tagName xxxx/>。

    ⑶元素属性

    元素属性依附于元素,必须通过元素调用,只能出现在起始标签中,其值用单引号或者双引号括起来。

    ⑷元素注释

    注释格式:<!--xxxx-->

    4.dom4j

    一种流行的读写XML文档的开源组件,导入架包就可使用。

    二 特殊字符的处理

    1.处理原因

    一些字符是标签的一部分,当出现在元素内容中时会被XML文档解析器视作标签而不是普通字符,这是就会出错误,为了避免这种情况的出现,使用一些特殊方式来处理这些歧义字符。

    2.处理方式

    ⑴替代法

    用其他字符替换歧义字符:

    歧义字符 替换字符
    < &lt;
    > &gt;
    & &amp;
    ' &apos;
    " &quot;

    ⑵CDATA字段

    • 一种标记法,在可能出现歧义的字符前放一个标记,当系统接触到标记,就按照预先定义的处理方式把标记中的字符当做普通字符。
    • 语法格式:<![CDATA[content]]>。
    • 在XML中使用正则表达式必须使用CDATA字段。

    三 几个重要类

    1.继承关系

    2.XMLWriter

    用来将创建的XML文档输出到文档中,一个装饰类,装饰了Writer或者OutputStream。

    • 如果装饰了字符流,为了防止输出到文档中的中文出现乱码,编码方式必须设为GBK。
    • 如果装饰了字节流,为了防止输出到文档中的中文出现乱码,编码方式必须可设为UTF-8。

    3.SAXReader

    XML文档对象创建类,基于硬盘上的文档创建封装了文档全部信息的对象。

    四 创建XML文档

    1.创建XML文档首先应该创建文档对象  

    Document  document=DocumentHelper.createDocument();

    2.创建根节点

    使用文档对象创建的节点即为根节点:

    Element  root=document.addElement(name);

    3.创建子节点:

    Element  child=root.addElement(name);

    4.向节点中添加内容

    • element.setText(content):添加普通内容。
    • element.addCDATA(content):添加CDATA字段。

    5.添加或修改属性:

    element.addAttibute(String  name,String  value);

    6.添加注释:

    element.addComment(commment);

    7.设置编码格式:

    OutputFormat  format=new  OutputFormat();
    format.setEncoding(xxxx);

    8.设置输出格式:

    默认情况下,XML文档采用紧凑方式排版,阅读不方便,可以将输出格式改为缩进方式:

    OutputFormat  format=OutputFormat.creatPrettyPrint();

    9.输出XML文档:

    ⑴未设置输出样式时输出:

    File  file=new  File(path);//创建文件对象
    XMLWriter  writer=new  XMLWriter(file);
    writer.close();

    ⑵设置了输出样式时输出:

    XMLWriter  writer=new  XMLWriter(file,format);

    ⑶输出到页面:

    PrintWriter  out=response.getWriter();
    XMLWriter  writer=new  XMLWriter(out,format);

    ⑷输出到控制台:

    XMLWriter  writer=new  XMLWriter(System.out,format);

    五 解析文档

    1.解析XML文档的方式:

    DOM4J:一次性将文件读取到内存,读取速度快,用于读取较小的文件,不适宜读取较大的文件。

    SAX:边读边解析,适用于读取较大的文件。

    2.子节点

    子节点指定的是一级目录下的节点,不包括二级目录及以下目录中的节点。

    3.解析文档的第一步是创建文档对象:

    File  file =new  File(path);
    SAXReader  reader=new  SAXReader();
    reader.read(file);

    4.获取根节点:

    Element  root=document.getRootElement();

    5.根据名称获取节点:

    • root.element(name):获取具有指定名称的节点,如果文档中包含多个,则返回第一个。
    • root.elements(name):以List集合返回具有指定名称的全部节点。

    6.XPath:

    XPath是一种根据路径获取xml文档节点的语言。

    基本语法格式:selectNodes(String xpath)/selectSingleNode(String xpath)。

    xpath有多种形式:

    ⑴根据名称获取节点:

    • nodeName:获取具有指定名称的全部子节点。
    • /root/xxxx:以相对于根节点的路径获取节点。
    • xxxx/xxxx:以相对于操作对象的路径获取节点。
    • //nodeName:不受路径限制,获取文档中指定名称的全部节点。
    • A//nodeName:获取A节点下具有指定名称的全部后代节点。

    ⑵根据索引获取节点:

    • A/nodeName[1]:获取子节中的第一个节点。
    • A/nodeName[last()]:获取子节点中最后一个节点。

    ⑶根据属性获取节点:

    • //nodeName[@attr]:不受路径限制,获取文档中具有指定名称与指定属性的全部节点。
    • //nodeName[@attr=‘xxx’]:不受路径限制,获取文档中具有指定名称与指定属性值的全部节点。
    • //nodeName[@attr+关系运算符xxxxx]:不受路径限制,获取文档中具有指定名称、同时满足关系运算的全部节点。

    7.遍历节点

    首先获取迭代器Iterator,该迭代器包含了具有指定名称的全部子节点:

    Iterator<Element> it = root.elementIterator("book");

    8.删除节点:

    • parentNode.remove(subNode):由父节点删除。
    • element.detach():自己删除自己。
    • parentNode.elements(name).clear():删除具有指定名称的全部节点。

    9.修改节点:

    element.setName("newName"),修改节点名称。

    10.获取属性:

    • Attribute  attr=element.attribute(String name):获取指定名称的属性。
    • Attribute  attr=element.attribute(int index):获取指定索引的属性,index从0开始。
    • String  value=attr.getValue():获取属性值。
    • String  value=element.attributeValue(name):直接根据属性名获取属性值。
    • List<Node> attributes = doc.selectNodes("//@count"):不受路径限制,获取文档中具有指定名称的全部属性。

    11.删除属性:

    • attr.detach():自己删除自己。
    • element.remove(attr):通过节点删除属性。

    12.获取内容:

    节点的内容指的是起始标签之间未被其他标签包含的文本,包含空格,所以才有了去除空格的方法getTextTrim。

    • element.getText():获取内容,未删除前后可能存在的空格。
    • element.getTextTrim():获取删除前后空格的内容。
  • 相关阅读:
    NOI2020省队联合选拔赛(JXOI2020)退役记
    NOI2020省队选拔赛前训练(打摆)记录
    一些省选题
    Codeforces Round #648 (Div. 2) 简要题解
    Atcoder NOMURA Programming Competition 2020简要题解
    AtCoder Grand Contest 020 简要题解
    Codeforces Round #643 (Div. 2) 题解
    Codeforces Round #642 (Div. 3) 题解
    【GDKOI2016】小学生数学题 【自然数幂求和】【斯特林数】
    【XSY3163】Tree Ext【二分】【最小生成树】【矩阵树定理】【拉格朗日插值】
  • 原文地址:https://www.cnblogs.com/tonghun/p/6914570.html
Copyright © 2020-2023  润新知