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使用备忘

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

  4. 如何从Java中打印XML?

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

  5. java中拼写xml

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

  6. 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 ...

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

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

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

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

  9. XStream – XStreamely使用Java中的XML数据的简便方法

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

最新文章

  1. Boosting和Bagging: 如何开发一个鲁棒的机器学习算法
  2. IP_FORWARD转发
  3. localhost 和 127.0.0.1
  4. arcgis python 保存当前窗口图形为jpg
  5. 企业环境中UM的规划设计和配置
  6. linux双网卡私网,linux双网卡路由配置私网专线
  7. 第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定
  8. 剑指offer刷题感想
  9. iOS连续上传多张图片
  10. [Java] 获取当前Project所在的路径
  11. 如何实现全选checkbox效果
  12. 插入行政区划编码的sql代码
  13. 一点点矩阵知识1:由一个矩阵理论题目展开的关于矩阵的核(kernel)与像(Image)的讲解。
  14. SI4463模块使用心得(无线协议)
  15. python做大数据可视化软件_四款最受欢迎的大数据可视化工具
  16. STM32CubeMX + STM32F407ZG + USB3300 高速USB实验(虚拟串口)
  17. 大数据、云计算该如何学习?
  18. 在 pygame 中好好玩玩精灵,滚雪球学 Python 游戏番
  19. matlab一维矩形积分,玩转matlab之一维 gauss 数值积分公式及matlab源代码
  20. codeforces C. Two Teams Composing

热门文章

  1. 三级pc技术_第十九周PC、笔电、数码周边新品汇总:AMD英特尔激战正酣
  2. spring boot actuator 入门荔枝
  3. 2021年最新springcloud配置中心不生效的版本原因
  4. Java IO(BIO, NIO, AIO) 总结
  5. java 进程运行时间_将Java类作为子进程运行
  6. 如何做到服务器虚拟化_尽可能地做到无服务器,但不止于此
  7. angluar cdk_零分钟即可在容器开发套件(CDK)上实现云运营
  8. ebook_[EBOOK]十大Java性能问题
  9. java 编写代码_如果您在2016年编写过Java代码-这是您不容错过的趋势
  10. bean创建异常_快速提示:消息驱动Bean中的异常处理