jaxb解析字符串xml_一个JAXB Nuance:字符串与枚举(受限制的XSD字符串)的枚举

jaxb解析字符串xml

尽管用于XML绑定的Java体系结构 ( JAXB )在名义情况下(尤其是自Java SE 6以来) 相当容易使用,但它也存在许多细微差别。 一些常见的细微差别是由于无法将 XML架构定义 (XSD)类型与Java 类型精确匹配 ( 绑定 )。 这篇文章看一个具体的例子,它还演示了当JAXB编译器生成Java类时,实施相同XML结构的不同XSD构造如何导致不同的Java类型。

下一个代码清单(用于Food.xsd )定义了食物类型的架构。 XSD要求有效的XML将具有一个称为“食物”的根元素,并带有三个嵌套元素“蔬菜”,“水果”和“甜点”。 尽管用于指定“ Vegetable”和“ Dessert”元素的方法与用于指定“ Fruit”元素的方法不同,但是两种方法都导致相似的“有效XML”。 “ Vegetable”和“ Dessert”元素直接声明为稍后在XSD中定义的指定simpleType的元素。 “水果”元素是通过引用( ref= )定义到另一个包含simpleType定义元素的。

Food.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:dustin="http://marxsoftware.blogspot.com/foodxml"targetNamespace="http://marxsoftware.blogspot.com/foodxml"elementFormDefault="qualified"attributeFormDefault="unqualified"><xs:element name="Food"><xs:complexType><xs:sequence><xs:element name="Vegetable" type="dustin:Vegetable" /><xs:element ref="dustin:Fruit" /><xs:element name="Dessert" type="dustin:Dessert" /></xs:sequence></xs:complexType></xs:element><!--Direct simple type that restricts xs:string will become enum inJAXB-generated Java class.--><xs:simpleType name="Vegetable"><xs:restriction base="xs:string"><xs:enumeration value="Carrot"/><xs:enumeration value="Squash"/><xs:enumeration value="Spinach"/><xs:enumeration value="Celery"/></xs:restriction></xs:simpleType><!--Simple type that restricts xs:string but is wrapped in xs:element(making it an Element rather than a SimpleType) will become JavaString in JAXB-generated Java class for Elements that reference it.--><xs:element name="Fruit"><xs:simpleType><xs:restriction base="xs:string"><xs:enumeration value="Watermelon"/><xs:enumeration value="Apple"/><xs:enumeration value="Orange"/><xs:enumeration value="Grape"/></xs:restriction></xs:simpleType></xs:element><!--Direct simple type that restricts xs:string will become enum inJAXB-generated Java class.        --><xs:simpleType name="Dessert"><xs:restriction base="xs:string"><xs:enumeration value="Pie"/><xs:enumeration value="Cake"/><xs:enumeration value="Ice Cream"/></xs:restriction></xs:simpleType></xs:schema>

尽管在模式中对Vegetable元素和Dessert元素的定义与对Fruit定义不同,但是生成的有效XML是相同的。 接下来在food1.xml的代码清单中显示一个有效的XML文件。

food1.xml

<?xml version="1.0" encoding="utf-8"?>
<Food xmlns="http://marxsoftware.blogspot.com/foodxml"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Vegetable>Spinach</Vegetable><Fruit>Watermelon</Fruit><Dessert>Pie</Dessert>
</Food>

此时,我将使用一个简单的Groovy脚本针对上述XSD验证上述XML。 接下来显示此Groovy XML验证脚本的代码( validateXmlAgainstXsd.groovy )。

validateXmlAgainstXsd.groovy

#!/usr/bin/env groovy// validateXmlAgainstXsd.groovy
//
// Accepts paths/names of two files. The first is the XML file to be validated
// and the second is the XSD against which to validate that XML.if (args.length < 2)
{println "USAGE: groovy validateXmlAgainstXsd.groovy <xmlFile> <xsdFile>"System.exit(-1)
}String xml = args[0]
String xsd = args[1]import javax.xml.validation.Schema
import javax.xml.validation.SchemaFactory
import javax.xml.validation.Validatortry
{SchemaFactory schemaFactory =SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI)Schema schema = schemaFactory.newSchema(new File(xsd))Validator validator = schema.newValidator()validator.validate(new javax.xml.transform.stream.StreamSource(xml))
}
catch (Exception exception)
{println "\nERROR: Unable to validate ${xml} against ${xsd} due to '${exception}'\n"System.exit(-1)
}
println "\nXML file ${xml} validated successfully against ${xsd}.\n"

下一个屏幕快照展示了针对food1.xmlFood.xsd运行上述Groovy XML验证脚本。

food1ValidatedAgainstFoodXsd

到目前为止,本文的目的是展示XSD中的不同方法如何导致相同的XML有效。 尽管这些不同的XSD方法规定了相同的有效XML,但是当使用JAXB生成基于XSD的类时,它们会导致不同的Java类行为。 下一个屏幕快照演示了针对Food.xsd运行JDK提供的JAXB xjc编译器以生成Java类。

xjcOnFoodXsd

上面显示的JAXB生成的输出表明Java类是为“ Vegetable”和“ Dessert”元素创建的,而不是为“ Fruit”元素创建的。 这是因为在XSD中,“蔬菜”和“甜点”的定义不同于“水果”。 下一个代码清单是由xjc编译器生成的Food.java类的。 由此可见,生成的Food.java类引用了针对VegetableDessert特定生成的Java类型,但仅引用了Fruit的通用Java字符串。

Food.java(由JAXB jxc编译器生成)

//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2015.02.11 at 10:17:32 PM MST 
//package com.blogspot.marxsoftware.foodxml;import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;/*** <p>Java class for anonymous complex type.* * <p>The following schema fragment specifies the expected content contained within this class.* * <pre>* <complexType>*   <complexContent>*     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">*       <sequence>*         <element name="Vegetable" type="{http://marxsoftware.blogspot.com/foodxml}Vegetable"/>*         <element ref="{http://marxsoftware.blogspot.com/foodxml}Fruit"/>*         <element name="Dessert" type="{http://marxsoftware.blogspot.com/foodxml}Dessert"/>*       </sequence>*     </restriction>*   </complexContent>* </complexType>* </pre>* * */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"vegetable","fruit","dessert"
})
@XmlRootElement(name = "Food")
public class Food {@XmlElement(name = "Vegetable", required = true)@XmlSchemaType(name = "string")protected Vegetable vegetable;@XmlElement(name = "Fruit", required = true)protected String fruit;@XmlElement(name = "Dessert", required = true)@XmlSchemaType(name = "string")protected Dessert dessert;/*** Gets the value of the vegetable property.* * @return*     possible object is*     {@link Vegetable }*     */public Vegetable getVegetable() {return vegetable;}/*** Sets the value of the vegetable property.* * @param value*     allowed object is*     {@link Vegetable }*     */public void setVegetable(Vegetable value) {this.vegetable = value;}/*** Gets the value of the fruit property.* * @return*     possible object is*     {@link String }*     */public String getFruit() {return fruit;}/*** Sets the value of the fruit property.* * @param value*     allowed object is*     {@link String }*     */public void setFruit(String value) {this.fruit = value;}/*** Gets the value of the dessert property.* * @return*     possible object is*     {@link Dessert }*     */public Dessert getDessert() {return dessert;}/*** Sets the value of the dessert property.* * @param value*     allowed object is*     {@link Dessert }*     */public void setDessert(Dessert value) {this.dessert = value;}}

具有特定的VegetableDessert类的优点是,与一般的Java String相比,它们具有附加的类型安全性。 Vegetable.javaDessert.java实际上都是枚举,因为它们来自XSD中的枚举值。 接下来的两个代码清单中显示了这两个生成的枚举。

Vegetable.java(使用JAXB xjc编译器生成)

//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2015.02.11 at 10:17:32 PM MST 
//package com.blogspot.marxsoftware.foodxml;import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;
import javax.xml.bind.annotation.XmlType;/*** <p>Java class for Vegetable.* * <p>The following schema fragment specifies the expected content contained within this class.* <p>* <pre>* <simpleType name="Vegetable">*   <restriction base="{http://www.w3.org/2001/XMLSchema}string">*     <enumeration value="Carrot"/>*     <enumeration value="Squash"/>*     <enumeration value="Spinach"/>*     <enumeration value="Celery"/>*   </restriction>* </simpleType>* </pre>* */
@XmlType(name = "Vegetable")
@XmlEnum
public enum Vegetable {@XmlEnumValue("Carrot")CARROT("Carrot"),@XmlEnumValue("Squash")SQUASH("Squash"),@XmlEnumValue("Spinach")SPINACH("Spinach"),@XmlEnumValue("Celery")CELERY("Celery");private final String value;Vegetable(String v) {value = v;}public String value() {return value;}public static Vegetable fromValue(String v) {for (Vegetable c: Vegetable.values()) {if (c.value.equals(v)) {return c;}}throw new IllegalArgumentException(v);}}

Dessert.java(使用JAXB xjc编译器生成)

//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2015.02.11 at 10:17:32 PM MST 
//package com.blogspot.marxsoftware.foodxml;import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;
import javax.xml.bind.annotation.XmlType;/*** <p>Java class for Dessert.* * <p>The following schema fragment specifies the expected content contained within this class.* <p>* <pre>* <simpleType name="Dessert">*   <restriction base="{http://www.w3.org/2001/XMLSchema}string">*     <enumeration value="Pie"/>*     <enumeration value="Cake"/>*     <enumeration value="Ice Cream"/>*   </restriction>* </simpleType>* </pre>* */
@XmlType(name = "Dessert")
@XmlEnum
public enum Dessert {@XmlEnumValue("Pie")PIE("Pie"),@XmlEnumValue("Cake")CAKE("Cake"),@XmlEnumValue("Ice Cream")ICE_CREAM("Ice Cream");private final String value;Dessert(String v) {value = v;}public String value() {return value;}public static Dessert fromValue(String v) {for (Dessert c: Dessert.values()) {if (c.value.equals(v)) {return c;}}throw new IllegalArgumentException(v);}}

为XML元素生成枚举可确保只能用Java表示这些元素的有效值。

结论

JAXB使将Java映射到XML相对容易,但是由于Java和XML类型之间没有一对一的映射,因此在某些情况下,为特定XSD规定元素生成的Java类型并不明显。 这篇文章显示了两种不同的构建XSD来强制使用相同的基本XML结构的方法如何导致用JAXB xjc编译器生成的Java类产生截然不同的结果。 在本文中显示的示例中,直接声明XSD上的元素在simpleType将XSD的string限制为一组特定的枚举值比将元素声明为引用其他封装了simpleType的限制字符串枚举值的元素更可取,因为类型安全这是在生成枚举而不是使用常规Java String的。

翻译自: https://www.javacodegeeks.com/2015/02/jaxb-nuance-string-versus-enum-enumerated-restricted-xsd-string.html

jaxb解析字符串xml

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

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

相关文章

php伪静态后不能访问html,php伪静态后html不能访问怎么办

php伪静态后html不能访问的解决办法&#xff1a;首先判断文件是否存在&#xff1b;然后设置存在则不rewirte&#xff0c;不存在且符合规则才rewrite&#xff1b;最后修改htaccess文件即可。推荐&#xff1a;《PHP视频教程》具体问题&#xff1a;PHP伪静态后不能访问纯html文件.…

c语言中,char型数据是以什么形式存储的?

C语言 字符型&#xff08;char&#xff09;简介字符型&#xff08;char&#xff09;用于储存字符&#xff08;character&#xff09;&#xff0c;如英文字母或标点。严格来说&#xff0c;char 其实也是整数类型&#xff08;integer type&#xff09;&#xff0c;因为char 类型储…

声明式编程与函数式编程_实用程序类与函数式编程无关

声明式编程与函数式编程最近&#xff0c;我被指控反对函数式编程&#xff0c;因为我将实用程序类称为反模式 。 绝对是错的&#xff01; 好吧&#xff0c;我确实认为它们是一个糟糕的反模式&#xff0c;但是它们与函数式编程无关。 我相信有两个基本原因。 首先&#xff0c;函数…

C语言中位运算符有哪些

C语言中位运算符有&#xff1a;位操作是程序设计中对位模式按位或二进制数的一元和二元操作。在许多古老的微处理器上&#xff0c; 位运算比加减运算略快&#xff0c; 通常位运算比乘除法运算要快很多。在现代架构中&#xff0c; 情况并非如此&#xff1a;位运算的运算速度通常…

jsf表单验证_JSF:在正确的阶段进行验证(了解生命周期)

jsf表单验证嗨&#xff0c;大家好&#xff01; 尽管标题强调验证一词&#xff0c;但本文实际上是关于JSF生命周期的。 那是因为我相信&#xff0c;真正了解生命周期的最简单方法之一就是通过做出我们一直在做的事情&#xff1a;验证用户输入。 通常&#xff0c;了解所谓的JSF…

java广度优先爬虫示例,【爬虫】广度优先遍历抓取数据概述

这次都是一些纯语言的表达&#xff0c;可能会有点啰嗦&#xff0c;或者有点枯燥&#xff0c;也是对爬虫的一些小小的见解&#xff0c;可能只是一些常见话&#xff0c;哈哈&#xff0c;还是耐心的写完。网络爬虫的整体执行流程&#xff1a;1)确定一个(多个)种子网页2)进行数据内…

if语句的用法是什么

if语句的用法&#xff1a;if语句是指编程语言&#xff08;包括c语言、C#、VB、java、汇编语言等&#xff09;中用来判定所给定的条件是否满足&#xff0c;根据判定的结果&#xff08;真或假&#xff09;决定执行给出的两种操作之一。if语句概述if语句是指编程语言&#xff08;包…

c语言如何实现玫瑰花

c语言实现玫瑰花的方法&#xff1a;#include #include ?#include #include #include #pragma comment(lib,"winmm.lib")//定义全局变量int rosesize 500;int h -250;//定义结构体struct DOT {double x;double y;double z;double r;double g;};bool calc(double a,…

maven 部署nexus_设置本地Nexus存储库并从Maven部署WAR文件

maven 部署nexusMaven Central充当中央存储库管理器&#xff0c;二进制文件由不同的团队/公司/个人上载并与世界其他地方共享。 就像github和其他对源代码控制非常有效的源代码存储库一样&#xff0c;这些存储库管理器还充当您自己生成的二进制工件的部署目标。 设置本地存储库…

c vector用法是什么

在c 中&#xff0c;vector是一个十分有用的容器&#xff0c;c vector用法是&#xff1a;1、基本操作(1)头文件#include.(2)创建vector对象&#xff0c;vector vec;(3)尾部插入数字&#xff1a;vec.push_back(a);(4)使用下标访问元素&#xff0c;cout<<vec[0]<<endl…

c语言for循环如何打印菱形

c语言for循环打印菱形的方法&#xff1a;使用两个for循环&#xff0c;实现条件判断&#xff0c;代码为【int i,j;for(i0; i<2*n-1; i )_(in-i-1&&jc语言for循环打印菱形的方法&#xff1a;方法一&#xff08;以循环为主打印&#xff09;#include void print(int n) …

quasar 异步回调_Java IO基准测试:Quasar与异步ForkJoinPool与ManagedBlock

quasar 异步回调“ Arien看到了我们运行的parallelStreams和ForkJoin基准测试的结果后&#xff0c;在Twitter上与我们联系。 这激起了他的兴趣&#xff0c;因此他进行了一些自己的测试&#xff0c;将Quasar纤维加入了混合物。 这是他的结果和结论。” –塔基皮&#xff08;Taki…

php微信自动回复机器人,微信自动回复机器人功能怎么实现?

原标题&#xff1a;微信自动回复机器人功能怎么实现&#xff1f;微信自动回复机器人功能怎么实现&#xff1f;最近有不少小伙伴都在询问这个问题。很多人在微信营销的过程中&#xff0c;都会有这样的问题&#xff0c;微信好友太多&#xff0c;想要都在第一时间回复&#xff0c;…

C语言怎么合并两个有序链表

C语言合并两个有序链表的方法&#xff1a;拼接指定的两个有序链表的所有节点即可。例如两个有序链表分别为【1->2->4】和【1->3->4】&#xff0c;合并后的有序链表为【1->1->2->3->4->4】。具体方法&#xff1a;将两个有序链表合并为一个新的有序链…

jira集成开发代码_7种JIRA集成可优化您的Java开发流程

jira集成开发代码有哪些最佳集成可以用来优化JIRA工作流程&#xff1f; 我喜欢寻找在工作流程中提高效率的方法。 看着那些小小的自动化和流畅的流程&#xff0c;我的脸上露出了微笑。 我知道我并不孤单&#xff0c;有时花费更多的时间来获得一点点提升以使其正常工作&#xff…

c语言源程序结构是怎样的?

一个C语言源程序至少一个有main函数&#xff0c;定义函数必须指定 4 个元素&#xff1a;返回类型、函数名、圆括号内的形参表&#xff08;可能为空&#xff09;和函数体。源程序的结构特点&#xff1a;1、一个C语言源程序可以由一个或多个源文件组成。2、每个源文件可由一个或多…

c语言规定在一个源程序中main函数的位置是什么?

一个c程序有且仅有一个main函数&#xff0c;除main函数之外可以有若干个其它的函数&#xff0c;每个函数实现某一特定的操作。C语言规定&#xff0c;在一个源程序中&#xff0c;main函数的位置可以任意。因为&#xff1a;在一个C语言源程序中&#xff0c;程序总是从main函数开始…

jax-ws和jax-rs_使用JAX-RS和Jetty创建Web服务和Rest Server

jax-ws和jax-rs用Java创建WebService非常容易。 将其添加到ServletContainer并将其部署到嵌入式WebServer仅需要几行代码。 让我们创建一个具有两个函数的简单计算器&#xff0c;作为WebService的示例。 计算器将计算任意数量的squareRoot和平方。 它将返回一个简单的JSON响应…

可运行的c语言程序的扩展名为什么?

C语言源程序经过C语言编译程序编译之后&#xff0c;生成一个后缀为“.OBJ”的二进制文件(称为目标文件)&#xff0c;最后还要由称为“连接程序”(link)的软件&#xff0c;把此“.OBJ”文件与c语言提供的各种库函数连接在一起&#xff0c;生成一个后缀“.EXE”的可执行文件。显然…

activemq消息持久化_将ActiveMQ持久消息传递性能提高25倍

activemq消息持久化Apache ActiveMQ&#xff0c;JBoss A-MQ和Red Hat Apache ActiveMQ是一个非常受欢迎的开源消息传递代理&#xff0c;由创建&#xff08;和从事&#xff09; Apache Karaf &#xff0c; Apache Camel &#xff0c; Apache ServiceMix以及许多其他工具的人提供…