XML:DOM4j解析XML

news2024/9/20 17:45:45

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就是根元素,
  • 元素可以包含属性,属性提供有关元素的附加信息,属性位于开始标签中。
<?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;

'

&apos;

"

&quot

CDATA区:

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

  <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树节点:
<?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>

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"

例题:

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

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()

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

2.获取XML根节点getRootElement()

Element rootElement = document.getRootElement();

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

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

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

//获取节点名称为books下所有子节点
List<Element> Elist = rootElement.elements(“books”);

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

//获取节点名称为books下单个子节点
Element element= rootElement.element(“books”);

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

newelement.setText("内容");

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

elenent.getText()

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

e.elementText(“book”)

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

e.attributeValue("name")

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

Element newelement = rootElement.addElement("span");

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

newelement.addAttribute("type","属性值");

13.新XML添加Documen对象

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

Document read = DocumentHelper.createDocument();

14.设置XML编码

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

OutputFormat outputFormat=OutputFormat.createPrettyPrint();
outputFormat.setEncoding("UTF-8");

15.写入XML文件

//写入XML文件的位置 以及指定的格式
XMLWriter xmlWriter=new XMLWriter(new FileWriter("cs.xml"),outputFormat);
//开始写入XML文件   写入Document对象
xmlWriter.write(document);
xmlWriter.close();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

再次理解UDP协议

一、再谈端口号 在 TCP / IP 协议中&#xff0c;用 "源 IP", "源端口号", "目的 IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n 查看) 我们需要端口号到进程的唯一性&#xff0c;所以一个…

工业控制系统等保2.0定级备案经验分享

工业控制系统和传统IT系统有所差异&#xff0c;须单独划分定级对象 工业控制系统定级时将现场采集/执行、现场控制和过程控制等要素应作为一个整体对象定级&#xff0c;各要素不单独定级&#xff1b;生产管理要素可单独定级。对于大型工业控制系统&#xff0c;可以根据系统功能…

Node-red 某一时间范围内满足条件的数据只返回一次

厂子里有个业务需求增加一段逻辑&#xff0c;根据点位数值&#xff0c;判断是否让mes执行之后的逻辑。 网关采集周期5s/次&#xff0c;及数据上报周期5s/次; iot通过网关写入时间为8s左右&#xff1b; 同类设备共用一条规则链&#xff1b; 想当触发条件时修改”完成上传“不…

SimpleAISearch:C# + DuckDuckGo 实现简单的AI搜索

最近AI搜索很火爆&#xff0c;有Perplexity、秘塔AI、MindSearch、Perplexica、memfree、khoj等等。 在使用大语言模型的过程中&#xff0c;或许你也遇到了这种局限&#xff0c;就是无法获取网上最新的信息&#xff0c;导致回答的内容不是基于最新的信息&#xff0c;为了解决这…

[Linux#55][网络协议] 序列化与反序列化 | TcpCalculate为例

目录 1. 理解协议 1.1 结构化数据的传输 序列化与反序列化 代码感知&#xff1a; Request 类 1. 构造函数 2. 序列化函数&#xff1a;Serialize() 3. 反序列化函数&#xff1a;DeSerialize() 补充 4. 成员变量 Response 类 1. 构造函数 2. 序列化函数&#xff1a;…

力扣 中等 2300.咒语和药水的成功对数

文章目录 题目介绍解法 题目介绍 解法 class Solution {public int[] successfulPairs(int[] spells, int[] potions, long success){Arrays.sort(potions);int n spells.length, m potions.length;int[] pairs new int[n];for (int i 0; i < n; i) {int left 0, righ…

无消息传递的图变换器中的图归纳偏差

人工智能咨询培训老师叶梓 转载标明出处 在处理小规模数据集时&#xff0c;图变换器的性能通常不尽如人意&#xff0c;特别是在需要明显的归纳偏好时。为了引入这些偏好&#xff0c;早期的图变换器一般会利用消息传递组件或位置编码。然而&#xff0c;依赖消息传递的图变换器在…

C# AutoResetEvent ManualResetEvent Mutex 对比

三个函数功能类似&#xff0c;都是线程同步的主要函数。但在使用上有一些差别。 关于代码的使用&#xff0c;帖子很多。形象的用图来描述一下。

【Meta分析】IF=12.1!人工智能预测模型Meta分析怎么做?

预测模型的Meta分析 人工智能&#xff08;AI&#xff09;是计算机科学的一个重要分支&#xff0c;其主要目标是让算法执行通常由人类完成的任务。机器学习是指一组允许算法从数据中学习并自我优化的技术&#xff0c;而无需明确编程。深度学习这一术语常与机器学习互换使用&…

怿星设计分享丨设计师与AI的情感化HMI

在当今科技迅速发展的时代背景下&#xff0c;人机交互&#xff08;HMI&#xff09;的设计正从传统的功能性层面转向更加注重用户体验与情感交流的方向。设计师们不再仅仅关注界面的功能性&#xff0c;而是更加重视如何通过设计传递情感&#xff0c;使用户在使用产品时能够感受到…

EsDA,一站式嵌入式软件

EsDA是一套面向工业智能物联领域的嵌入式系统设计自动化工具集&#xff0c;包含实时操作系统AWorksLP、低代码开发平台AWStudio、资源管理平台AXPI、跨平台GUI引擎AWTK和云服务平台ZWS&#xff0c;旨在提高嵌入式软件开发的效率、性能和可扩展性。 EsDA全称是嵌入式系统设计自动…

回归预测|基于饥饿游戏搜索优化随机森林的数据回归预测Matlab程序HGS-RF 多特征输入单输出 高引用先用先创新

回归预测|基于饥饿游戏搜索优化随机森林的数据回归预测Matlab程序HGS-RF 多特征输入单输出 高引用先用先创新 文章目录 一、基本原理1. 饥饿游戏搜索优化算法&#xff08;HGS&#xff09;简介2. 随机森林&#xff08;RF&#xff09;简介3. HGS-RF回归预测流程1. 初始化2. 随机森…

三维手势 handpose 3D RGB 手势3D建模 三维建模-手势舞 >> DataBall

请关注即将发布 handpose x plus 项目 三维手势 handpose 3D RGB 单目相机手势识别 手语 歌曲 Friends 手势检测 手势3D建模 三维建模 咨询合作 DataBall 项目&#xff0c;欢迎加以下微信。 助力快速掌握数据集的信息和使用方式。

sourceTree保姆级教程7:(合并某次提交)

在日常开发过程中&#xff0c;大家有时候并非都是在同一个分支进行开发&#xff0c;可能存在多人的情况下开发。根据上线的需求依次提交代码。当然也可能存在交叉提交的情况。此时应如何在master分支去合并具体某一次的提交呢&#xff1f;下面就开始了&#xff1a; 1.打开本地…

巧用联合与枚举:解锁自定义类型的无限潜力

嘿嘿,家人们,今天咱们来详细剖析C语言中的联合与枚举,好啦,废话不多讲,开干! 目录 1.:联合体 1.1:联合体类型的声明 1.1.1:代码1 1.1.2:代码2(计算机联合体的大小) 1.1.3:代码3 1.2:联合体的特点 1.2.1:代码1 1.2.2:代码2 1.3:相同成员的结构体与联合体进行对比 1.3…

前端界面搜索部分,第一个选择框的值,影响第二个选择框的值

1.字段声明 {title: 单位名称,dataIndex: departmentId,align: center,width: 100,hideInTable: true,renderFormItem: (item, { defaultRender, ...rest }) > (<ProFormSelectname"departmentId"// label"单位名称"options{hospitaltData}onChange…

旋转矩阵乘法,自动驾驶中的点及坐标系变换推导

目录 1. 矩阵乘法的内项相消 2. 左右乘&#xff0c;内外旋与动静坐标系 3. 点变换 3.1 点旋转后的点坐标表示 3.2 坐标系旋转后的点坐标表示 4. 坐标变换的实质 1. 矩阵乘法的内项相消 关于旋转变换&#xff0c;离不开矩阵的乘法&#xff0c;而矩阵乘法的物理意义和本身数…

电脑usb控制软件有哪些?6款软件帮你轻松解决USB端口泄密烦恼!

在数字化时代&#xff0c;企业的信息安全成为重中之重。 然而&#xff0c;USB端口泄密事件频发&#xff0c;给企业的数据安全和业务连续性带来了巨大威胁。 此前&#xff0c;某大型制造企业&#xff0c;由于员工在日常工作中频繁使用U盘等USB存储设备&#xff0c;导致公司核心…

[Linux]自定义shell详解

自定义shell 前言1.命令行提示符&#xff0c;字符串的打印1.1命令行提示符2.命令行字符串 2.0对命令行字符串进行切割2.执行命令3.有趣的小问题完整代码 前言 写之前我们先看看一个完整的shell都包括了什么 $符号前面&#xff08;包括这个符号&#xff09;就是命令行提示符&a…

电线电缆制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

电线电缆制造行业作为关键的基础设施建设领域&#xff0c;正积极拥抱新技术&#xff0c;推动生产方式的深刻变革。电线电缆制造5G智能工厂物联数字孪生平台的兴起&#xff0c;不仅为行业注入了新的活力&#xff0c;更为制造业的数字化转型树立了新的标杆。 电线电缆制造5G智能…