宣布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更加易于使用。
哦,如果您想出一个更好的名字,请告诉我。
翻译自: https://www.javacodegeeks.com/2013/11/announcing-eaxy-making-xml-easier-in-java.html
宣布EAXY:在Java中简化XML相关推荐
- 宣布EAXY:使Java中的XML更容易
Java中的XML库是一个雷区. 操作和读取XML所需的代码量令人震惊,使用不同的库遇到类路径问题的风险很大,并且对名称空间的处理带来许多混乱和错误. 最糟糕的是,情况似乎并没有改善. 一位同事让我意 ...
- Java 中的 XML:Java 文档模型的用法
Java 中的 XML:Java 文档模型的用法 英文原文 内容: 代码对比 DOM JDOM dom4j Electric XML XPP 结束语 下一次... 参考资料 关于作者 对本文的评价 相 ...
- Java中操作Xml使用备忘
List item 文章目录 Java中操作Xml使用备忘 1. Hutool中XmlUtil的使用简介 2. Hutool中XmlUtil快速读取Xml字符串某个节点值 [简单取值时,推荐使用] 2 ...
- 如何从Java中打印XML?
本文翻译自:How to pretty print XML from Java? I have a Java String that contains XML, with no line feeds ...
- java中拼写xml
本文为博主原创,未经博主允许,不得转载: xml具有强大的功能,在很多地方都会用的到.比如在通信的时候,通过xml进行消息的发送和交互. 在项目中有很多拼写xml的地方,进行一个简单的总结. 先举例如 ...
- 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 ...
- matlab分析xml文件_修改Java中的XML文件(DOM分析器)
matlab分析xml文件 We can modify XML file in Java using DOM parser. We can add elements, remove elements, ...
- xstream xml模板_XStream – XStreamely使用Java中的XML数据的简便方法
xstream xml模板 有时候,我们不得不处理XML数据. 而且大多数时候,这不是我们一生中最快乐的一天. 甚至有一个术语" XML地狱"描述了程序员必须处理许多难以理解的XM ...
- XStream – XStreamely使用Java中的XML数据的简便方法
有时候,我们不得不处理XML数据. 而且大多数时候,这不是我们一生中最快乐的一天. 甚至有一个术语" XML地狱"描述了程序员必须处理许多难以理解的XML配置文件时的情况. 但是, ...
最新文章
- Boosting和Bagging: 如何开发一个鲁棒的机器学习算法
- IP_FORWARD转发
- localhost 和 127.0.0.1
- arcgis python 保存当前窗口图形为jpg
- 企业环境中UM的规划设计和配置
- linux双网卡私网,linux双网卡路由配置私网专线
- 第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定
- 剑指offer刷题感想
- iOS连续上传多张图片
- [Java] 获取当前Project所在的路径
- 如何实现全选checkbox效果
- 插入行政区划编码的sql代码
- 一点点矩阵知识1:由一个矩阵理论题目展开的关于矩阵的核(kernel)与像(Image)的讲解。
- SI4463模块使用心得(无线协议)
- python做大数据可视化软件_四款最受欢迎的大数据可视化工具
- STM32CubeMX + STM32F407ZG + USB3300 高速USB实验(虚拟串口)
- 大数据、云计算该如何学习?
- 在 pygame 中好好玩玩精灵,滚雪球学 Python 游戏番
- matlab一维矩形积分,玩转matlab之一维 gauss 数值积分公式及matlab源代码
- codeforces C. Two Teams Composing
热门文章
- 三级pc技术_第十九周PC、笔电、数码周边新品汇总:AMD英特尔激战正酣
- spring boot actuator 入门荔枝
- 2021年最新springcloud配置中心不生效的版本原因
- Java IO(BIO, NIO, AIO) 总结
- java 进程运行时间_将Java类作为子进程运行
- 如何做到服务器虚拟化_尽可能地做到无服务器,但不止于此
- angluar cdk_零分钟即可在容器开发套件(CDK)上实现云运营
- ebook_[EBOOK]十大Java性能问题
- java 编写代码_如果您在2016年编写过Java代码-这是您不容错过的趋势
- bean创建异常_快速提示:消息驱动Bean中的异常处理