首页 > 编程语言 >Java 操作 XML(15)--XOM 使用

Java 操作 XML(15)--XOM 使用

时间:2023-11-05 20:46:52浏览次数:51  
标签:XML appendChild school Java -- Element student new XOM

XOM 是一个面向对象的 XML API,有点像 DOM 风格,但是许多功能使XOM与众不同,其中最主要的是严格维护内存对象中的不变性,以便始终可以将 XOM 实例序列化以更正 XML。本文主要介绍使用 XOM 处理 XML,文中所使用到的软件版本:Java 1.8.0_341、XOM 1.3.9。

1、简介

XOM 被设计成易于学习和使用。它的工作方式非常直观,学习曲线非常平缓。如果您已经熟悉 XML,应该能够很快地开始使用 XOM。

XOM 是唯一一款在正确性方面不妥协的 XML API。XOM 只接受命名空间格式良好的 XML 文档,并且只允许您创建命名空间格式良好的 XML 文档。(事实上,它比这还要严格:它实际上保证所有文档都是可相互转换的,具有明确定义的 XML 信息集。)XOM 会管理您的 XML,使您无需费心。有了 XOM,您可以专注于应用程序的独特价值,并信任 XOM 正确处理 XML。

XOM 在两个关键方面相当独特,它是一个同时支持流式处理和树结构的 API。在构建文档时,可以同时处理树中的各个节点。这使得 XOM 程序几乎可以与底层解析器提供数据的速度相匹配。您无需等待文档完全解析后才能开始使用它。

XOM 非常高效地利用内存。如果将整个文档读入内存,XOM 会尽可能地节省内存。更重要的是,XOM 允许在文档构建过程中进行过滤,因此您无需构建不感兴趣的树部分。例如,如果在应用程序中表示边界的空白文本节点不重要,可以跳过构建它们。甚至可以逐段处理文档,并在处理完每个段后将其丢弃。XOM 已用于处理占用几个 GB 的文档。

2、使用 XOM 处理 XML

2.1、XML 文件

<?xml version="1.0" encoding="utf-8" ?>
<school:grade xmlns:school="http://www.w3.org/TR/html4/school/">
    <school:student rollno="1" school:age="10">
        <school:firstname>cxx1</school:firstname>
        <lastname>Bob1</lastname>
        <nickname>stars1</nickname>
        <marks>85</marks>
    </school:student>
    <student rollno="2">
        <school:firstname>cxx2</school:firstname>
        <lastname>Bob2</lastname>
        <nickname>stars2</nickname>
        <marks>85</marks>
    </student>
    <student rollno="3">
        <school:firstname>cxx3</school:firstname>
        <lastname>Bob3</lastname>
        <nickname>stars3</nickname>
        <marks>85</marks>
    </student>
</school:grade>

2.2、引入依赖

<dependency>
    <groupId>xom</groupId>
    <artifactId>xom</artifactId>
    <version>1.3.9</version>
</dependency>

2.3、使用例子

该例子演示了使用 XOM 解析 XML、XOM 中 XPath 的使用以及使用 XOM 来生成 XML。

package com.abc.demo.ws;

import lombok.extern.slf4j.Slf4j;
import nu.xom.*;
import org.junit.Test;


@Slf4j
public class XomCase {
    @Test
    public void parse() throws Exception {
        String namespace = "http://www.w3.org/TR/html4/school/";
        Builder builder = new Builder(false);
        Document document = builder.build(XomCase.class.getClassLoader().getResourceAsStream("student.xml"));
        Element root = document.getRootElement();
        Elements elements = root.getChildElements();
        for (Element student : elements) {
            String rollno = student.getAttributeValue("rollno");
            Attribute ageAttribute = student.getAttribute("age", namespace);
            String age = null;
            if (ageAttribute != null) {
                age = ageAttribute.getValue();
            }
            String firstname = student.getFirstChildElement("firstname", namespace).getValue();
            String lastname = student.getFirstChildElement("lastname").getValue();
            String nickname = student.getFirstChildElement("nickname").getValue();
            String marks = student.getFirstChildElement("marks").getValue();
            log.info("rollno={},age={},firstname={},lastname={},nickname={},marks={}", rollno, age, firstname, lastname, nickname, marks);
        }
    }

    @Test
    public void xpath() throws Exception {
        String namespace = "http://www.w3.org/TR/html4/school/";
        Builder builder = new Builder(false);
        Document document = builder.build(XomCase.class.getClassLoader().getResourceAsStream("student.xml"));
        log.info("查找存在rollno属性的student节点,找到的节点再查找lastname子节点,找到的节点再查找文本节点");
        Nodes nodes = document.query("//student[@rollno]/lastname/text()");//第二、三位学生
        //Nodes nodes = document.query("//student[@rollno]/child::lastname/text()");//效果同上
        for (Node node : nodes) {
            log.info(node.getValue());
        }

        log.info("查找存在rollno属性的school:student节点,找到的节点再查找school:firstname子节点");
        XPathContext xPathContext = new XPathContext("school", namespace);
        nodes = document.query("//school:student/school:firstname", xPathContext);//第一位学生
        for (Node node : nodes) {
            log.info(node.getValue());
        }
    }

    @Test
    public void toXml() throws Exception {
        String namespace = "http://www.w3.org/TR/html4/school/";
        Element root = new Element("school:grade", namespace);
        //第一个student
        Element student = new Element("school:student", namespace);
        student.addAttribute(new Attribute("rollno", "1"));
        student.addAttribute(new Attribute("school:age", namespace, "10"));
        Element firstname = new Element("school:firstname", namespace);
        firstname.appendChild("cxx1");
        student.appendChild(firstname);
        Element lastname = new Element("lastname");
        lastname.appendChild("Bob1");
        student.appendChild(lastname);
        Element nickname = new Element("nickname");
        nickname.appendChild("stars1");
        student.appendChild(nickname);
        Element marks = new Element("marks");
        marks.appendChild("85");
        student.appendChild(marks);
        root.appendChild(student);

        //第二个student
        Element student2 = new Element("school:student", namespace);
        student2.addAttribute(new Attribute("rollno", "2"));
        Element firstname2 = new Element("school:firstname", namespace);
        firstname2.appendChild("cxx2");
        student2.appendChild(firstname2);
        Element lastname2 = new Element("lastname");
        lastname2.appendChild("Bob2");
        student2.appendChild(lastname2);
        Element nickname2 = new Element("nickname");
        nickname2.appendChild("stars2");
        student.appendChild(nickname2);
        Element marks2 = new Element("marks");
        marks2.appendChild("85");
        student2.appendChild(marks2);
        root.appendChild(student2);

        //第三个student
        Element student3 = new Element("school:student", namespace);
        student3.addAttribute(new Attribute("rollno", "3"));
        Element firstname3 = new Element("school:firstname", namespace);
        firstname3.appendChild("cxx3");
        student3.appendChild(firstname3);
        Element lastname3 = new Element("lastname");
        lastname3.appendChild("Bob3");
        student3.appendChild(lastname3);
        Element nickname3 = new Element("nickname");
        nickname3.appendChild("stars3");
        student3.appendChild(nickname3);
        Element marks3 = new Element("marks");
        marks3.appendChild("85");
        student3.appendChild(marks3);
        root.appendChild(student3);

        Document document = new Document(root);
        log.info(document.toXML());
        //序列化,可以设置输出格式
        Serializer serializer = new Serializer(System.out,"UTF-8");
        //缩进空格数
        serializer.setIndent(4);
        //每行最大宽度
        serializer.setMaxLength(60);
        serializer.write(document);
        serializer.flush();
    }
}

 

 

参考:
https://github.com/elharo/xom/
https://xom.nu/tutorial.xhtml

标签:XML,appendChild,school,Java,--,Element,student,new,XOM
From: https://www.cnblogs.com/wuyongyin/p/17756601.html

相关文章

  • 重新学习算法_Day2
    今天复习了栈先入后出和队列先进先出 ......
  • 异常检测算法-完全卷积数据描述子FCDD
    文献来源:EXPLAINABLEDEEPONE-CLASSCLASSIFICATION   最近在做一些异物检测之类的算法任务,原本想使用目标识别算法,但是问题是正样本太多,而负样本没几个。所以有必要使用异常检测算法,日后不妨再结合目标识别任务去做。在正式开始前,需要先简单介绍一个广义损失函数的东西......
  • 软件设计1
    [实验任务一]:UML复习阅读教材第一章复习UML,回答下述问题:面向对象程序设计中类与类的关系都有哪几种?分别用类图实例说明。1,关联关系  2,依赖关系  3,泛化关系  4,接口与实现关系    [实验任务二]:单一职责原则登录模块在实际项目开发中很常见,请按照教......
  • 牛客小白月赛80C/D又放学辣
    C这么小的数据范围,想必胡搞就可以了。#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;intn,m,k;structcll{intp;intid;}cl[105];intx;intans[205];boolcmp(cllx,clly){returnx.p......
  • 记一次翻页性能优化
    背景   由于是公司项目,所以不方便给出代码或者视频,只能列一些自己画的流程图。   大致情况如上,前端有7个显示区。在对其进行滚动翻页的时候,存在以下问题:1.连续滚轮翻页,每次所有显示区刷新完,进行下一次翻页用时较久。(说人话就是,平均耗时翻页时间长)2.连续滚轮翻页,会出......
  • 2023-2024-1 20231312 《计算机基础与程序设计》第6周学习总结
    作业信息这个作业属于哪个课程<班级的链接>2023-2024-1-计算机基础与程序设计|-这个作业要求在哪里<作业要求链接>2023-2024-1计算机基础与程序设计第6周作业|这个作业的目标《计算机基础概论》第7章《C语言程序设计》第5章|作业正文作业链接教材学习......
  • 查找数组中元素
    1.代码#include<stdio.h>intmain(){inta[6]={60,75,95,80,65,90},b;scanf("%d",&b);if(b!=a[0]&&b!=a[1]&&b!=a[2]&&b!=a[3]&&b!=a[4]&&b!=a[5]){printf("NotIncluded......
  • 程序员为啥要做副业(05)-业务解决方案缔造
    除了技术,副业也可以帮助我们在业务上获得新认知,保持敏感性。之前我们在做程序员职业成长服务的时候,发现了一个问题。很多初阶的程序员没法升到中高阶,有两个很大的非技术影响因素:1管理能力每个程序员即使把自己的潜力发挥到极致,成为十倍开发者(10xdeveloper),他可以处理的事情也......
  • 039-第三代软件开发-PDF阅读器
    第三代软件开发-PDF阅读器文章目录第三代软件开发-PDF阅读器项目介绍PDF阅读器1初始化PDFview2qml中使用3创建模块关键字:Qt、Qml、pdf、LTDev、本地项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta-ObjectLanguage)和C++的强大功能,旨在开发出色的......
  • 038-第三代软件开发-简易视频播放器-自定义Slider (二)
    第三代软件开发-简易视频播放器-自定义Slider(二)文章目录第三代软件开发-简易视频播放器-自定义Slider(二)项目介绍简易视频播放器自定义Slider(二)横向纵向关键字:Qt、Qml、关键字3、关键字4、关键字5项目介绍欢迎来到我们的QML&C++项目!这个项目结合了QML(QtMeta-......