宣布EAXY:在Java中简化XML

Java中的XML库是一个雷区。 操作和读取XML所需的代码量令人震惊,使用不同的库遇到类路径问题的风险很大,并且命名空间的处理带来了很多混乱和错误。 最糟糕的是,情况似乎并没有改善。

一位同事让我意识到JOOX库。 这是解决这些问题的一个很好的尝试。 我发现JOOX有一些缺点,这使我想探索替代方法,然后自然地我写了自己的库 (就像您所做的那样)。 我希望该库允许对XML的轻松操作,并且在判断不足的情况下,我将库命名为EAXY。 这是一个非常糟糕的名字,所以我很高兴提出改进建议。

这是我要解决的问题:

  • 用Java代码创建相当复杂的XML树应该很容易
  • 使用名称空间应该简单明了。 (这是JOOX让我失败的地方)
  • 从XML结构中读取值应该很容易。
  • 使用文件结构或类路径中的现有XML文档应该很容易
  • 库应该更喜欢引发异常而不是静默失败。
  • 另外,我想通过添加便捷功能来使其更易于处理(X)HTML。

1.创建一个XML文档

XML文档只是一棵树。 如何将树与Java语法树对齐。 例如,假设您要以编程方式想要构建有关本文的一些反馈:

Element email = Xml.el("message",Xml.el("recipients",Xml.el("recipent",Xml.attr("type", "email"),Xml.attr("role", "To"),Xml.text("mailto:johannes@brodwall.com")),Xml.el("recipent", Xml.attr("type", "email"),Xml.attr("role", "Cc"),Xml.text("mailto:contact@brodwall.com"))),Xml.el("subject", "EAXY feedback"),Xml.el("contents", "I think this is an interesting library"));

每个元素(Xml.el)都有一个标记名称,并且可以嵌套其他元素,属性(Xml.attr)或文本(Xml.text)。 如果元素仅包含文本,则甚至不需要调用Xml.text。 语法经过优化,因此,如果要在Xml。*上进行静态导入,可以编写如下代码:

Element email = el("message",el("recipients",el("recipent",attr("type", "email"),attr("role", "to"),text("mailto:johannes@brodwall.com")),el("recipent",attr("type", "email"),attr("role", "cc"),text("mailto:contact@brodwall.com"))),el("subject", "EAXY feedback"),el("content", "I think this is an interesting library"));

2.读取XML

用Java代码读取XML可能是一个挑战。 DOM API使得任何事情都变得极其冗长。 您使用的是XPath,但在紧凑方面可能有点过多,而且当您做错了什么时,结果只是您得到一个空集合或一个空值。 我认为我们可以对此进行改进。

考虑以下:

System.out.println(email.find("recipients", "recipient").texts());

我下调XML树结构并获取上一条消息的所有收件人电子邮件地址。 但是,等等-运行此代码将返回一个空列表。 EAXY允许我们避免为此挠头:

System.out.println(email.find("recipients", "recipient").check().texts());

现在,我得到以下异常:

org.eaxy.NonMatchingPathException: Can't find {recipient} below [message, recipients].Actual elements: [Element{recipent}, Element{recipent}]

如您所见,我们在邮件中拼写了“收件人”。 稍后让我们回到这个问题,但是现在,让我们解决它以创建有意义的东西:

for (Element recipient : email.find("recipients", "recipent")) {if ("to".equals(recipient.attr("role"))) {System.out.println(recipient.text());}
}

同样,我认为这与Java语法所允许的一样流畅。

3.验证和名称空间

因此,我们收到一条消息,其中元素名称之一拼写错误。 如果您拥有要使用的XML的XSD文档,则可以对此进行验证。 但是,您可能已经习惯使用Java XML库时,执行此验证的动作完全隐藏在复杂的API后面。 因此,我提供了一些帮助:

Xml.validatorFromResource("mailmessage.xsd").validate(email);

这将从类路径中读取mailmessage.xsd,这对我来说是最常见的用例。

当然,大多数架构都不会引用空名称空间中的元素。 使用验证时,通常必须在特定的名称空间中构造元素。 在大多数用于处理XML的Java库中,很难且容易出错,尤其是在混合名称空间时。 我已经将名称空间作为Eaxy库的主要功能:

Namespace MSG_NS = new Namespace("http://eaxy.org/test/mailmessage", "msg");
Element email = MSG_NS.el("message",MSG_NS.el("recipients",MSG_NS.el("recipient",MSG_NS.attr("type", "email"),attr("role", "cc"),text("mailto:contact@brodwall.com"))));

请注意,“类型”和“角色”属性属于不同的名称空间-这种情况在其他库中尤其难以实现。

4.模板化

从类路径中读取XSD启发了另一种用法:如果我们在类路径中有一个XML文档作为模板,然后使用Java代码来操纵该文档,该怎么办。 这对于XHTML尤其方便:

Document doc = Xml.readResource("testdocument.html");
Element peopleElement = doc.select("#peopleForm");peopleElement.add(el("input",attr("type", "text"),attr("name", "firstName"),attr("value", "Johannes")));
peopleElement.add(el("input", attr("type", "text"), attr("name", "lastName"),attr("value", "Brodwall")));

此代码从类路径中读取文件testdocument.html,选择ID为“ peopleForm”的元素,并向其中添加两个输入元素。

5. HTML的便利性

在上面的代码中,我们设置了HTML输入元素的类型,名称和值属性。 这些是HTML操作中最常用的属性之一。 为了使此操作更容易,我向Eaxy添加了一些便捷方法:

peopleElement.add(el("input").type("text").name("firstName").val("Johannes"));
peopleElement.add(el("input").type("text").name("lastName").val("Brodwall"));

我要优化的最后一种情况是处理HTML中的表单。 这是一些在处理表格之前可以将其发送给用户的代码。

HtmlForm form = new HtmlForm(peopleElement);
form.set("firstName", "Johannes");
form.set("lastName", "Brodwall");doc.writeTo(req.getWriter());

在这里,我直接设置表单内容。 如果参数名称拼写错误,代码将引发异常,因此很容易确保正确使用它。

结论

我有五个示例,说明如何使用Eaxy轻松完成大多数Java XML库所难以实现的工作:使用纯Java代码创建文档树,读取和操作XML树的各个部分,使用命名空间和验证,模板化和处理(X)HTML文档和表单。

该库现在不稳定,但是对于XML库来说,不稳定可能不是很危险的情况,因为大多数错误在生产前很容易就可以检测到。

我希望您可能会发现尝试在代码中使用此库来处理XML和(X)HTML操作很有用。 我希望某些用户可以帮助我消除错误,并使Eaxy更加易于使用。

哦,如果您想出一个更好的名字,请告诉我。

参考: 宣布EAXY:来自我们的JCG合作伙伴 Johannes Brodwall在“ 更大的盒子里思考”博客中的Java中的XML简化。

翻译自: https://www.javacodegeeks.com/2013/11/announcing-eaxy-making-xml-easier-in-java.html

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

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

相关文章

9-客户端集成IdentityServer

1-创建客户端的webapi项目 E:\coding\netcore\IdentityServerSample>dotnet new webapi --name IdentityCredentialApi 2-在需要启用授权的方法上增加Authorize标签 3-使用nuget工具安装 IdentityServer4.AccessTokenValidation 4-启用客户端授权, 需要配置连接…

js parseInt()与Number()区别

说到转换成数字类型,我首先想到的是parseInt()方法,后来接触多了才发现还有一个Number()方法,同样是转换成数字类型,这两种方法有什么不同的呢? 1.parseInt()&#xff1a…

java大小端字节流解析_玩转socket之字节流操作--拼包、拆包

玩转socket之字节流操作--拼包、拆包我们开发中用得最多的HTTP协议及超文本传输协议,是一种基于TCP/IP的文本传输协议。基本很少碰到字节流操作。但是我过我们要用socket,实现一套基本TCP/IP协议的自定义协议,那么,对于字节流的操…

js替换数组中字符串实例

这个是替换数组中的一个对象字符串; 直接上代码: 1 var aaa[ 2 {"name":"张珊","sex":"man"}, 3 {"name":"李斯","sex":"woman"}, 4 …

ie浏览器升级_微软呼吁用户停用IE浏览器 2020年将不再更新升级

驱动中国2019年2月10日消息 IE浏览器作为美国微软公司推出的一款网页浏览器成为许多人接触互联网初选,深受不少用户喜欢但这款流畅多年的浏览器正式遭弃用!今日微软网络安全专家在在官方Winhows IT Pro上发帖呼吁用户停止使用IE浏览器!微软网…

有条件忽略测试的JUnit规则

我一直认为使用Ignore停用测试是一个坏主意。 例外,这可能是一种将间歇性失败的测试放入隔离区以供以后处理的方法(如Martin Fowler 在此处所述 )。 随着越来越多的测试不断被忽略和遗忘,这带来了测试套件衰减的危险。 因此&#…

【学亮IT手记】PL/SQL游标编程

游标提供了一种从表中检索数据并进行操作的灵活手段,主要用在服务器上,处理由客户端发送给服务器端的sql语句,或者是批处理、存储过程、触发器中的数据处理请求。 显式游标 是由用户声明和操作的一种游标,通常用于将查询出的结果集…

CentOS安装zookeeper

第一步,先去Apache下载安装包 http://mirror.bit.edu.cn/apache/zookeeper/ 第二步,上传到服务器并解压 tar -zxvf zookeeper-3.4.6 第三步,新建一个文件夹 #先改个名 mv zookeeper-3.4.6 zookeeper cd zookeeper mkdir data 第四步&#xff…

php根据id查找条件怎么写_thinkphp where()条件查询

今天来给大家讲下查询最常用但也是最复杂的where方法,where方法也属于模型类的连贯操作方法之一,主要用于查询和操作条件的设置。where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括…

3分钟简单了解 prototype 和 __proto__

关于prototype 1. 所有的函数都会有一个prototype属性,属性值是一个普通对象; 2. 当我们去new一个构造函数的实例时,构造函数的原型对象(prototype)会被赋值给它实例的[[Prototype]]属性上; 3. prototype可被称为“显式原型”。…

rdlc报表 矩形高固定_固定资产条码管理系统特点分析

固定资产条码管理系统的特点都有什么?固定资产是维持企业稳定健康发展的重要物质保障,若想最大化发挥固定资产的效能作用,满足生产经营管理的需求,提高应对企业内外部经营环境变化的能力,企业管理者就必须及时了解固定…

Spring 4中@ControllerAdvice的改进

在Spring 4的许多新功能中,我发现了ControllerAdvice的改进。 ControllerAdvice是Component的特殊化,用于定义适用于所有RequestMapping方法的 ExceptionHandler, InitBinder和ModelAttribute方法。 在Spring 4之前, ControllerAd…

bzoj 2007 [Noi2010]海拔——最小割转最短路

题目:https://www.lydsy.com/JudgeOnline/problem.php?id2007 一个点的高度一定不是0就是1。答案一定形如一个左上角的连通块全是0的点、一个右下角的连通块全是1的点。 注意从东到西还有从南到北的边也有用!因为不一定是一个阶梯形的,还可以…

php 四维数组_PHP 多维数组

PHP - 两维数组两维数组是数组的数组(三维数组是数组的数组的数组)。首先,让我们看看下面的表格:品牌库存销量Volvo3320BMW1715Saab52Land Rover1511我们能够在两维数组中存储上表中的数据,就像这样:$cars array(array("Vol…

Vue于React特性对比(二)

一,关于响应式数据更新方式的实现 1)只有在data里面定义的数据才会有响应式更新 vue依赖的defineProperty的数据劫持加上依赖数据,实现数据的响应式更新。可以称之为依赖式的响应。因为依赖所以注定了只会更新与data相关的数据。 2&#xff0…

《黑客攻防技术宝典Web实战篇@第2版》读书笔记1:了解Web应用程序

读书笔记第一部分对应原书的第一章,主要介绍了Web应用程序的发展,功能,安全状况。 Web应用程序的发展历程 早期的万维网仅由Web站点构成,只是包含静态文档的信息库,随后人们发明了Web浏览器用来检索和显示那些文档&am…

电脑入门完全自学手册_3DMAX零基础入门到精通的学习路线和教程

没有美术基础可以学建模吗?毋庸置疑,只要肯学都是可以的!那么我们今天来说说零基础学习建模要着重注意什么。最高效最快速的入门学习方式:看知识兔视频课程,跟着知识兔老师操作,听知识兔老师讲解&#xff0…

使用Java RMI时要记住的两件事

这是一篇简短的博客文章,介绍使用Java RMI时应注意的两个常见陷阱。 设置java.rmi.server.hostname 如果您感到陌生,Connection拒绝托管: RMI客户端上的错误消息,并且您确定连接应该正常工作(您仔细检查了所有标准配置…

Python-UiAutomator2实现Android自动化测试

本帖转自搜狗测试公众号 【一、前言】 基于Python-UiAutomator2实现Android自动化测试,小编在Android应用的自动化性能测试中进行了实践。本篇将简单介绍python中使用adb、aapt命令的方法以及Python-UiAutomator2使用,后续文章将对环境搭建以及自动化性能…

阅读笔记:ImageNet Classification with Deep Convolutional Neural Networks

概要: 本文中的Alexnet神经网络在LSVRC-2010图像分类比赛中得到了第一名和第五名,将120万高分辨率的图像分到1000不同的类别中,分类结果比以往的神经网络的分类都要好。为了训练更快,使用了非饱和神经元并对卷积操作进行双GPU实现…