saxon 使用

XML和JSON对我来说很重要,我感谢Apress让我写了一整本有关它们的书。 在本文中,我将简要介绍新书的第二版Java XML和JSON 。 如果有足够的空间,我还将展示两个有用的演示,希望将它们包含在书中。

首先,我将向您展示如何使用XSLT 2.0+和XPath 2.0+兼容的替代品(在本例中为SAXON)重写Xalan,这是Java 11的标准XSLT实现。 使用SAXON for XSLT / XPath可以更轻松地访问诸如分组之类的功能,我还将对此进行演示。 接下来,我将向您展示两种使用Jackson转换XML到JSON的方法:第一种技术是数据绑定,第二种是树遍历。

获取代码

下载本教程中示例的源代码

为什么使用XML和JSON?

在XML到来之前,我编写了软件来导入以未记录的二进制格式存储的数据。 我使用调试器来识别数据字段类型,文件偏移量和长度。 当出现XML和JSON时,这项技术极大地简化了我的生活。

Java XML和JSON的第一版(2016年6月)介绍了XML和JSON,探讨了Java SE自己的面向XML的API,并探讨了Java SE的外部面向JSON的API。 由Apress最近发行的第二版提供了新内容,并(希望)回答了有关XML,JSON,Java SE的XML API和各种JSON API(包括JSON-P)的更多问题。 它还针对Java SE 11更新。

写完这本书之后,我写了另外两个部分,分别介绍了SAXON和Jackson的有用功能。 我将在本文中介绍这些部分。 首先,我将花一点时间介绍这本书及其内容。

Java XML和JSON,第二版

理想情况下,在研究本文的其他内容之前,您应该阅读Java XML和JSON的第二版。 即使您还没有读过这本书,也应该知道本书的内容,因为该信息将其他内容放在上下文中。

Java XML和JSON的第二版分为三个部分,包括12章和附录:

  • 第1部分:探索XML

    • 第1章:XML简介
    • 第2章:使用SAX解析XML文档
    • 第3章:使用DOM解析和创建XML文档
    • 第4章:使用StAX解析和创建XML文档
    • 第5章:使用XPath选择节点
    • 第6章:使用XSLT转换XML文档
  • 第2部分:探索JSON
    • 第7章:JSON简介
    • 第8章:使用mJson解析和创建JSON对象
    • 第9章:使用Gson解析和创建JSON对象
    • 第10章:使用JsonPath提取JSON值
    • 第11章:使用Jackson处理JSON
    • 第12章:使用JSON-P处理JSON
  • 第3部分:附录
    • 附录A:练习答案

第1部分重点介绍XML。 第1章定义了关键术语,介绍了XML语言功能(XML声明,元素和属性,字符引用和CDATA部分,名称空间以及注释和处理指令),并介绍了XML文档验证(通过文档类型定义和模式)。 其余五章探讨Java SE的SAX,DOM,StAX,XPath和XSLT API。

第2部分重点介绍JSON。 第7章定义关键术语,介绍JSON语法,在JavaScript上下文中演示JSON(因为Java SE尚未正式支持JSON),并演示了如何验证JSON对象(通过JSON Schema Validator在线工具)。 其余五章探讨了第三方mJSon,Gson,JsonPath和Jackson API。 以及Oracle面向Java EE的JSON-P API,该API也可以非正式地用于Java SE上下文中。

每章都以一组练习(包括编程练习)结尾,这些练习旨在增强读者对材料的理解。 答案在本书的附录中显示。

新版本在某些方面与先前版本有所不同:

  • 第2章介绍了获取XML阅读器的正确方法。 不建议使用上一版的方法。
  • 第3章还介绍了DOM的Load and Save,Range和Traversal API。
  • 第6章显示了如何使用SAXON超越XSLT / XPath 1.0。
  • 第11章是探讨杰克逊的新篇章(冗长)。
  • 第12章是新的(冗长的)一章,探讨JSON-P。

此版本还纠正了上一版本内容中的细微错误,更新了各种数字,并增加了许多新的练习。

虽然在第二版中没有足够的空间,但将来的Java XML和JSON版本可能会涵盖YAML 。

XML与JSON? 没那么快。 。 。

XML和JSON通常会进行比较,但是它们实际上是相辅相成的。 卢卡斯·沃格尔(Lucas Vogel)在他的文章中指出了这一点: “ JSON与XML:争夺格式霸权之争可能是浪费精力 。”

第6章的附录:使用XSLT转换XML文档

使用SAXON超越XSLT / XPath 1.0

Java 11的XSLT实现基于Apache Xalan Project ,该项目支持XSLT 1.0和XPath 1.0,但仅限于这些早期版本。 要访问更高版本的XSLT 2.0+和XPath 2.0+功能,您需要使用诸如SAXON之类的替代方法来覆盖Xalan实现。

Java XML和JSON,第6章显示了如何使用SAXON覆盖Xalan,然后验证是否正在使用SAXON。 在演示中,我建议在应用程序的main()方法的开头插入以下行,以便使用SAXON:

System.setProperty("javax.xml.transform.TransformerFactory","net.sf.saxon.TransformerFactoryImpl");

实际上,您不需要此方法调用,因为SAXON的TransformerFactory实现作为一种服务提供在JAR文件中,当可通过类路径访问JAR文件时,该服务会自动加载。 但是,如果类路径上有多个TransformerFactory实现JAR文件,并且Java运行时选择了非SAXON服务作为转换器实现,则可能会出现问题。 包括上述方法调用将使用SAXON覆盖该选择。

XSLT / XPath功能:一个演示

第6章介绍了两个XSLTDemo应用程序,书的代码档案中提供了第三个应用程序。 下面的清单1展示了第四个XSLTDemo演示应用程序,该应用程序重点介绍了XSLT / XPath功能。

清单1. XSLTDemo.java

import java.io.FileReader;
import java.io.IOException;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;import org.w3c.dom.Document;import org.xml.sax.SAXException;import static java.lang.System.*;public class XSLTDemo
{public static void main(String[] args){if (args.length != 2){err.println("usage: java XSLTDemo xmlfile xslfile");return;}try{DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.parse(args[0]);TransformerFactory tf = TransformerFactory.newInstance();out.printf("TransformerFactory: %s%n", tf);FileReader fr = new FileReader(args[1]);StreamSource ssStyleSheet = new StreamSource(fr);Transformer t = tf.newTransformer(ssStyleSheet);Source source = new DOMSource(doc);Result result = new StreamResult(out);t.transform(source, result);}catch (IOException ioe){err.printf("IOE: %s%n", ioe.toString());}catch (FactoryConfigurationError fce){err.printf("FCE: %s%n", fce.toString());}catch (ParserConfigurationException pce){err.printf("PCE: %s%n", pce.toString());}catch (SAXException saxe){err.printf("SAXE: %s%n", saxe.toString());}catch (TransformerConfigurationException tce){err.printf("TCE: %s%n", tce.toString());}catch (TransformerException te){err.printf("TE: %s%n", te.toString());}catch (TransformerFactoryConfigurationError tfce){err.printf("TFCE: %s%n", tfce.toString());}}
}

清单1中的代码类似于第6章的清单6-2,但是有一些区别。 首先,必须使用两个命令行参数调用清单1的main()方法:第一个参数命名XML文件;第二个参数命名XML文件。 第二个参数命名XSL文件。

第二个区别是我没有在变压器上设置任何输出属性。 具体来说,我没有指定输出方法或是否使用缩进。 这些任务可以在XSL文件中完成。

如下编译清单1:

javac XSLTDemo.java

XSLT 2.0示例:分组节点

XSLT 1.0不提供对分组节点的内置支持。 例如,您可能想要转换以下XML文档,该文档列出了作者的书籍:

<book title="Book 1"><author name="Author 1" /><author name="Author 2" />
</book>
<book title="Book 2"><author name="Author 1" />
</book>
<book title="Book 3"><author name="Author 2" /><author name="Author 3" />
</book>

到以下XML中,该XML列出了作者及其书籍:

<author name="Author 1"><book title="Book 1" /><book title="Book 2" />
</author>
<author name="Author 2"><book title="Book 1" /><book title="Book 3" />
</author>
<author name="Author 3"><book title="Book 3" />
</author>

尽管在XSLT 1.0中可以进行这种转换,但是很尴尬。 相比之下,XSLT 2.0的xsl:for-each-group元素使您可以获取一组节点,按某个条件对其进行分组,并处理每个创建的组。

让我们从处理XML文档开始探讨这种功能。 清单2给出了books.xml文件的内容,该文件按书名对作者姓名进行分组。

清单2. books.xml(按书名分组)

<?xml version="1.0"?>
<books><book title="Securing Office 365: Masterminding MDM and Compliance in the Cloud"><author name="Matthew Katzer"/><publisher name="Apress" isbn="978-1484242292" pubyear="2019"/></book><book title="Office 2019 For Dummies"><author name="Wallace Wang"/><publisher name="For Dummies" isbn="978-1119513988" pubyear="2018"/></book><book title="Office 365: Migrating and Managing Your Business in the Cloud"><author name="Matthew Katzer"/><author name="Don Crawford"/><publisher name="Apress" isbn="978-1430265269" pubyear="2014"/></book>
</books>

清单3给出了books.xsl文件的内容,该文件提供了XSL转换,可以将该文档转换为根据作者姓名对书名进行分组的文档。

清单3. books.xsl(按作者姓名分组)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="2.0"><xsl:output method="html" indent="yes"/><xsl:template match="/books">
<html>
<head>
</head>
<body><xsl:for-each-group select="book/author" group-by="@name"><xsl:sort select="@name"/>
<author name="{@name}"><xsl:for-each select="current-group()"><xsl:sort select="../@title"/>
<book title="{../@title}" /></xsl:for-each>
</author></xsl:for-each-group>
</body>
</html></xsl:template>
</xsl:stylesheet>

xsl:output元素指示需要缩进HTML输出。 xsl:template-match元素与单个books根元素匹配。

xsl:for-each-group元素选择一个节点序列并将其组织为groupsselect属性是一个XPath表达式,用于标识要分组的元素。 在这里,告诉您选择属于book元素的所有author元素。 group-by属性将所有具有相同键值的元素归为一 ,恰好是author元素的@name属性。 从本质上讲,您最终分为以下几组:

Group 1Matthew Katzer
Matthew KatzerGroup 2Wallace WangGroup 3Don Crawford

这些组不按作者姓名的字母顺序排列,因此将输出author元素,以使Matthew Katzer在前, Don Crawford在后。 xsl:sort select="@name"元素可确保author元素按排序顺序输出。

<author name="{@name}">构造输出一个<author>标记,其name属性仅分配给该组中的第一个作者名称。

继续, xsl:for-each select="current-group()"遍历当前for-each-group迭代组中的作者姓名。 xsl:sort select="../@title"构造将xsl:sort select="../@title"对输出book元素进行排序,该元素通过随后的<book title="{../@title}" />结构指定。

翻译自: https://www.infoworld.com/article/3346229/java-xml-and-json-document-processing-for-java-se-part-1.html

saxon 使用

saxon 使用_Java XML和JSON:Java SE的文档处理,第1部分:SAXON和Jackson相关推荐

  1. java se说明文档_Java笔记---Java官方API文档的下载及使用

    个人网站还在做数据迁移和备案,就先写在简书了(博客园将常被盗取),但是知道为啥不能发布Markdown Java 官方API文档 官方文档即是最好的学习教材 API文档是什么 说明文档,用于说明每个类 ...

  2. java客户端api文档_Java 11:新的HTTP客户端API

    java客户端api文档 在Java 11中,已将最初在Java 9中引入的孵化HTTP客户端API进行了标准化. 它使连接URL,管理请求参数,cookie和会话更加容易,甚至支持异步请求和webs ...

  3. java 转换xml格式的doc或docx文档为docx以及docx转PDF

    转换xml格式的doc或docx文档为docx import org.docx4j.Docx4J; import org.docx4j.openpackaging.packages.Wordproce ...

  4. 使用javaHelp制作java swing帮助文档

    使用javaHelp制作java swing帮助文档 最近在做一个Swing项目,项目接近尾声,需要做最后的帮助系统了.就想到了javaHelp.JavaHelp是sun退出的编写帮助系统的一个类库, ...

  5. Java API帮助文档怎么查找?

    [1]打开官方帮助文档(英文):Java SE API 和文档 这里选择官方网站 打开之后,是这样婶儿的 [2]选择合适的版本:这里选择Java 8 [3]打开Java API 主页面 如何查找自己想 ...

  6. java 界面艺术字,Java 在Word文档中添加艺术字

    与普通文字相比,艺术字更加美观有趣也更具有辨识度,常见于一些设计精美的杂志或宣传海报中.我们在日常工作中编辑Word文档时,也可以通过添加艺术字体来凸显文章的重点,美化页面排版.这篇文章将介绍如何使用 ...

  7. 使用java将word文档docx,doc(包含图形,文本框)完美转换成所有格式图片(pdf,png,gif,jpeg等等)

    使用java将word文档docx,doc(包含图形,文本框,图片等)完美转换成所有格式图片(pdf,png,gif,jpeg等等)下文中附带代码,效果图等 思路 使用到的包 实现代码 效果图: 思路 ...

  8. Java 将word文档转成html内容,输出到富文本

    使用Java 将word文档转成html内容,输出到富文本 上传word文档 解析到富文本 将word解析成html工具类 import com.common.utils.DateUtil; impo ...

  9. Java在PDF文档中添加或删除页面

    前言 当你编辑一个PDF文档时,有时需要删除文档中多余的页面或向文档中添加新的页面.本文将向您演示如何使用Spire.PDF for Java在PDF文档中添加或删除页面. 程序环境 安装Spire. ...

最新文章

  1. access在哪里可以设主键_access利用DAO设置数据表的主键
  2. Java开发技巧:Java如何编译运行?
  3. linux最初配置( vimrc设置 、tab键设置 inputrc、中文输入法等等)
  4. 【转】C#命名空间大全详细教程
  5. 探索中国广电“智慧城市”未来转型路径
  6. 前端ajax数据提交到服务器_详解前端如何让服务器主动向浏览器推送数据
  7. OSC源创会【放码过来】环节精彩回顾
  8. ACM学习历程—HDU5396 Expression(递推 计数)
  9. 微波工程(5)——滤波器
  10. 教务管理系统数据字典mysql_学校教务管理系统--数据库课程设计
  11. Java之ApiPost工具
  12. 车辆模型-动力学模型(Dynamics Model)
  13. python sorted函数倒序_Python sorted函数
  14. python tkinter ttk_关于tkinter和ttk的新教程,适用于Python 3
  15. C++ Reference: Standard C++ Library reference: C Library: cfenv: FE_DOWNWARD
  16. 【LED灯屏控制器】AG10K 烧录程序(2)
  17. 2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
  18. 数据透视表如何做累计求和
  19. maya轮廓光材质快速创建插件 下载及教程
  20. arm oe linux gnueabi 系统,[MDM9X07] ME3610/3630开发环境快速搭建

热门文章

  1. linux虚拟机不能远程桌面连接不上去,Windows无法远程桌面的解决方案
  2. 破除条块间的信息墙 ——玉溪市智慧城市建设经验介绍
  3. 配置将java转换为python环境
  4. 11gR2数据库发现aler log中有报错:ORA-27090 async io
  5. 想要成为一名标准的数据分析师,需要看哪些书
  6. 云计算要具备什么技能 如何学好云计算架构
  7. matlab建模遇见的一些问题和解决方法
  8. 洛克王国服务器维护中,帮助中心-洛克王国-Roco Kingdom-官方网站-腾讯儿童-点亮魔法,放飞童年...
  9. 【转】SAP学习手册
  10. c# 获取中国气象局全国城市代码(weather.com.cn)