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

宣布EAXY:使Java中的XML更容易相关推荐

  1. 宣布EAXY:在Java中简化XML

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

  2. Java 中的 XML:Java 文档模型的用法

    Java 中的 XML:Java 文档模型的用法 英文原文 内容: 代码对比 DOM JDOM dom4j Electric XML XPP 结束语 下一次... 参考资料 关于作者 对本文的评价 相 ...

  3. 如何从Java中打印XML?

    本文翻译自:How to pretty print XML from Java? I have a Java String that contains XML, with no line feeds ...

  4. Java中操作Xml使用备忘

    List item 文章目录 Java中操作Xml使用备忘 1. Hutool中XmlUtil的使用简介 2. Hutool中XmlUtil快速读取Xml字符串某个节点值 [简单取值时,推荐使用] 2 ...

  5. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

  6. java中拼写xml

    本文为博主原创,未经博主允许,不得转载: xml具有强大的功能,在很多地方都会用的到.比如在通信的时候,通过xml进行消息的发送和交互. 在项目中有很多拼写xml的地方,进行一个简单的总结. 先举例如 ...

  7. matlab分析xml文件_如何在Java中读取XML文件(DOM分析器)

    matlab分析xml文件 Today we will learn how to read the XML file in Java. We will also learn how to parse ...

  8. matlab分析xml文件_修改Java中的XML文件(DOM分析器)

    matlab分析xml文件 We can modify XML file in Java using DOM parser. We can add elements, remove elements, ...

  9. xstream xml模板_XStream – XStreamely使用Java中的XML数据的简便方法

    xstream xml模板 有时候,我们不得不处理XML数据. 而且大多数时候,这不是我们一生中最快乐的一天. 甚至有一个术语" XML地狱"描述了程序员必须处理许多难以理解的XM ...

最新文章

  1. 如何使用工具包 (NLTK) 开发NLP 项目?(附教程)
  2. php主要算法设计,四种排序算法设计(PHP)
  3. 初学Java开发,这9本书值得一看
  4. nullnullGet previous business day
  5. 灰度内测是什么意思?
  6. java selenium (二) 环境搭建方法一
  7. php执行cmd/shell命令 木马小后门
  8. AspNetPager控件+repeater+Ajax+存储过程实现高效分页,还有漂亮控件样式
  9. 中国及中国各省矢量地图数据下载
  10. 工作站安装Ubuntu,显卡驱动,pytorch全流程
  11. 思岚S2激光雷达1—初次连接
  12. JSHOP2学习1:环境配置(超详细教程)
  13. 吃糖果 (HDU-1205)(鸽笼原理(抽屉原理))
  14. c++thread里暂停线程_C语言如何正确的终止正在运行的子线程
  15. 零基础学SQL(二、MYSQL数据类型)
  16. 花旗报告揭秘2016全球FinTech变革全景、“AI如何落地”公开课分享 | AI金融评论周刊...
  17. 计算机如何添加新用户,笔记本电脑怎么样快速添加新用户帐号
  18. 开源星空照片_如何拍摄星空的好照片
  19. 使用Python的Scrapy框架编写web爬虫的简单示例
  20. 网页打开新窗口——Window.open()详解

热门文章

  1. 【期望】【高斯消元】图上游走(金牌导航 期望-6)
  2. CDN如何实现,关键技术是什么?
  3. Class类中的getEnclosingXX、getDeclaredXX
  4. 神奇,教你用随机数打印hello world
  5. javaWeb服务详解(含源代码,测试通过,注释) ——web.xml
  6. JavaScript实现搜索框效果
  7. 28. 实现 strStr()---LeetCode---JAVA(今天又是一行超人)
  8. Tomacat乱码解决
  9. 四足爬行机器人运动_有自我意识机器人横空出世,还能自我复制,专家表示需警惕其失控...
  10. 系统架构师5 ***********那就给个合格分了。111