XML:DOM4j解析XML

XML简介:

什么是XML:XML 是独立于软件和硬件的信息传输工具。

  • XML 的设计宗旨是传输数据,而不是显示数据。
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML不会做任何事情,XML被设计用来结构化、存储以及传输信息。

XML可以发明自己的标签:

HTML仅仅可以用在 标准中定义过的标签

而XML没有预定义的标签,XML允许创作者定义自己的标签和自己的文档结构

特点:

XML与操作系统、编程语言的开发平台无关实现不同系统之间的数据交换

作用:

数据交互配置应用程序和网站Ajax基石

文档声明:

复制代码
<?xml version="1.0" encoding="UTF-8"?>

属性值用双引号包裹

一个元素可以有多个属性

属性值中不能直接包含<、"、&

不建议使用的字符:'、>

XML编写注意事项:
  • 所有XML元素都必须有结束标签
  • XML标签对大小写敏感XML必须正确的嵌套
  • 同级标签以缩进对齐
  • 元素名称可以包含字母、数字或其他的字符
  • 元素名称不能以数字或者标点符号开始
  • 元素名称中不能含空格
  • 属性必须加""

XML 文档:

  • XML文件必须要有根元素,这里的class就是根元素,
  • 元素可以包含属性,属性提供有关元素的附加信息,属性位于开始标签中。
javascript 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<class>
    <student name="王显明">
        <score predicted="75" actualScore="80" />
    </student>
    <student name="宋佳">
        <score predicted="75" actualScore="88" />
    </student>
</class>

XML实体引用:

在xml这样是错误的,因为xml会把<当作一个新的开始标签

复制代码
<message>if salary < 1000 then</message>

为了为避免我们就可以用实体标签:

|----|--------|
| < | &it; |
| > | &gt |
| & | &amp; |
| ' | ' |
| " | &quot |

CDATA区:

CDATA 区段中的内容不会被 XML 解析器处理为 XML 标签或特殊字符,而是作为纯文本来处理。

javascript 复制代码
  <content>
        <![CDATA[
       aaaa<<<>>>
        ]]>
    </content>
XML注释:

和html的注释一样

复制代码
<!-- This is a comment -->
xml的空格:

在html中空格会被合并为1个,但是XML中空格不会被删减

XML元素:

元素命名规则:
  • 名称可以包含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字母 xml(或者 XML、Xml 等等)开始
  • 名称不能包含空格

XML属性:

  • 属性值必须被引号包围,不过单引号和双引号均可使用。

    <person sex="female">

也可以

复制代码
<person sex='female'>

没有什么规矩可以告诉我们什么时候该使用属性,而什么时候该使用元素。我的经验是在 HTML 中,属性用起来很便利,但是在 XML 中,您应该尽量避免使用属性。如果信息感觉起来很像数据,那么请使用元素吧。

XML命名空间:

xmlns:[前缀属性] ="[命名空间的URL]"

解决在复杂、大型XML文件中,出现名称相同,但是含义不同的元素

这样可以在同一个文档中使用 bookauthor 命名空间下的元素,避免名称冲突并保持数据结构的清晰性。

  • xmlns:book="http://www.example.com/book" 定义了一个名为 book 的命名空间,用于描述书籍相关的元素。

  • xmlns:author="http://www.example.com/author" 定义了一个名为 author 的命名空间,用于描述作者相关的元素。

    <?xml version="1.0" encoding="UTF-8"?> <document xmlns:book="http://www.example.com/book" xmlns:author="http://www.example.com/author"> <book:title>The Great Gatsby</book:title> <author:name>F. Scott Fitzgerald</author:name> </document>

DOM4j解析XML:

1.DOM解析XML

DOM把XML文档映射成一个倒挂的树

访问DOM树节点:
javascript 复制代码
<?xml version="1.0" encoding="GB2312"?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="U8650"/>
        <Type name="HW123"/>
        <Type name="HW321"/>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone4"/>
    </Brand>
</PhoneInfo>
javascript 复制代码
package QuestionPpt02;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;

public class UtilPhone {
    public static void main(String[] args) {
        //将xml文件加载到内存中  XM;解析器
        SAXReader saxReader = new SAXReader();
        //加载执行获取Document对象
        try {
            Document document = saxReader.read("D:\\idea-workspace\\Book03\\ch010\\src\\QuestionPpt02\\phone.xml");
            //获取根节点
            Element rootElement = document.getRootElement();
            //获取该节点下的所有子节点
            List<Element> Elist = rootElement.elements();
            for (Element e : Elist){
                System.out.println("子节点为_____________________"+e.getName()+"____________________________________");
                //获取当前点下所有子节点
                List<Element> EChild = e.elements();
                for (Element child : EChild){
                    System.out.println("Brand的子节点为_________"+child.getName());
                    System.out.println("获取当前节点属性"+child.attributeValue("name"));
                }
                //获取当前节点的属性
                System.out.println(  e.attributeValue("name"));

            }


        } catch (DocumentException e) {
            throw new RuntimeException(e);
        }
    }
}

具体的DOM4j的pdf地址:

"D:\AAAhz鸿卓\2Java三本书\高级编程\高级编程资料\dom4j解析XML.doc"

例题:

写入的时候需要 获取文档对象读再 获取写入对象

javascript 复制代码
public class UtilsXml {

    public static void main(String[] args) {
        //读取XML
        //showXml();
        editXml();


    }

    /**
     * 修改文档内容
     */
    public static void editXml(){
        try {
            //读取原有的文档
            //构建解析器
            SAXReader saxReader = new SAXReader();
            //通过read方法获得doc对象
            Document document = saxReader.read("ch10/students.xml");
            //获得根节点
            Element root =  document.getRootElement();
            List<Element> elementList = root.elements();
            for(Element element:elementList){
                if("1002".equals(element.attributeValue("id")))
                {
                    element.element("name").setText("王五");
                }
            }
            //新增节点
            Element stu = root.addElement("stu");
            stu.addAttribute("id","1003");
            stu.addElement("name").setText("马六");
            stu.addElement("age").setText("20");
            stu.addElement("score").addAttribute("value","77");

            //document 写入students.xml
            XMLWriter xmlWriter = new XMLWriter(
                    new FileWriter("ch10/students.xml"));
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }



    public static void showXml(){

        try {
            //构建解析器
            SAXReader saxReader = new SAXReader();
            //通过read方法获得doc对象
            Document document = saxReader.read("ch10/students.xml");
            //获得根节点
            Element root =  document.getRootElement();
            //打印根节点名称
            System.out.println("根节点:"+root.getName());
            //获得所有子节点
            List<Element> elements = root.elements();
            for(Element element : elements)
            {
               System.out.println("---------stu--------");
               //获得每个子节点上的id属性值
               String id = element.attributeValue("id");
               System.out.println("id:"+id);
               //获得stu下name元素节点
               Element name = element.element("name");
               System.out.println("name:"+name.getText());
               Element age = element.element("age");
               System.out.println("age:"+age.getText());
               Element score = element.element("score");
               System.out.println("score:"+score.attributeValue("value"));
            }

        } catch (Exception e) {
           e.printStackTrace();

        }
    }
}

dom4j解析XML:

1.读取xml文件 SAXReader()

javascript 复制代码
//将xml文件加载到内存中 XML解析器
SAXReader saxReader = new SAXReader();
//document 加载执行xml文档获取Document对象
Document document = saxReader.read(XML路径);

2.获取XML根节点getRootElement()

javascript 复制代码
Element rootElement = document.getRootElement();

3.获取当前节点下所有子节点 elements()

javascript 复制代码
//获取根节点下所有子节点
List<Element> Elist = rootElement.elements();

4.根据指定子元素名,获取元素下所有子节点

javascript 复制代码
//获取节点名称为books下所有子节点
List<Element> Elist = rootElement.elements("books");

5.根据指定子元素名,获取子元素对象,如果重复,则获取第一个

javascript 复制代码
//获取节点名称为books下单个子节点
Element element= rootElement.element("books");

6.设置元素文本内容 setText()

javascript 复制代码
newelement.setText("内容");

7.获取当前节点文本内容 getText()

javascript 复制代码
elenent.getText()

8.根据指定子元素名,获取元素中的文本

javascript 复制代码
e.elementText("book")

9.获取当前节点属性 attributeValue("属性名")

javascript 复制代码
e.attributeValue("name")

11**.创建节点Element对象.addElement("节点名")**

javascript 复制代码
Element newelement = rootElement.addElement("span");

12.节点添加,修改属性Element对象.addAttribute("节点属性名","属性值")

javascript 复制代码
newelement.addAttribute("type","属性值");

13.新XML添加Documen对象

通过DocumentHelper.creatDocument()创建一个Document对象

javascript 复制代码
Document read = DocumentHelper.createDocument();

14.设置XML编码

通过OutputFormat的静态方法createPrettyPrint()创建OutputFormat对象,并设置编码集

javascript 复制代码
OutputFormat outputFormat=OutputFormat.createPrettyPrint();
outputFormat.setEncoding("UTF-8");

15.写入XML文件

javascript 复制代码
//写入XML文件的位置 以及指定的格式
XMLWriter xmlWriter=new XMLWriter(new FileWriter("cs.xml"),outputFormat);
//开始写入XML文件   写入Document对象
xmlWriter.write(document);
xmlWriter.close();
相关推荐
Dcs14 分钟前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing20 分钟前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者31 分钟前
Java的SPI机制详解
java
超级小忍1 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug1 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享1 小时前
Java Lombok 入门
java
程序无bug1 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队1 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端
苦学编程的谢1 小时前
Maven
java·maven·intellij-idea
考虑考虑1 小时前
Maven 依赖范围(Scope)
java·后端·maven