xsd 相关问题

XSD通常是指以W3C XML Schema格式编写的文档,其中包含特定类型的XML文档的描述。

生成基本 int 的枚举

我正在尝试使用 Maven maven-jaxb2-plugin 从简单类型的基本 int 生成枚举。但没有生成任何枚举。 我可以看到生成器正在使用绑定文件,因为它...

回答 1 投票 0

添加 maxOccurs 指示器后,为什么此 xml 架构对于 .NET 数据集变得无效?

将下面的 xml 传递给 C# 程序中的 DataSet.ReadXml 函数(使用 .NETFramework v4.8)时,该函数会抛出异常,表明 foo 的声明重复(“Dupli...

回答 1 投票 0

如何在java 11中使用JAXB Maven插件创建POJO类

需要在java 11中使用JAXB maven插件创建Pojo类,我在java 8中使用这个插件并且工作正常: org.jvnet.jaxb2.maven2...

回答 1 投票 0

Kotlin - JAXB 解组导致错误

我在解组时遇到了大问题。 我使用 xsd 文件中的 xjc 数据类生成。 这似乎工作没有任何问题。 现在我在我的 Kotlin 项目中尝试了这个 val jaxbContext = JAXBContext.

回答 1 投票 0

无法使用 JAXB 编组器为来自不同包的嵌套对象生成 XML

**XSD1** **XSD1** <xs:complexType name="Root1"> <xs:sequence> <xs:element name="Revision" type="xs:string" /> <xs:element name="Header" type="Header" /> <xs:element name="Body" type="SwAny" minOccurs="0" /> </xs:sequence> </xs:complexType> <xs:complexType name="SwAny" mixed="true"> <xs:sequence> <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> The JAVA Object for the above XSD is like below @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "root1", propOrder = { "revision", "header", "body" }) public class Root1 implements Serializable { private final static long serialVersionUID = 1L; @XmlElement(name = "Revision", required = true) protected String revision; @XmlElement(name = "Header", required = true) protected SAA_Header header; @XmlElement(name = "Body") protected SAA_SwAny body; -- getter and setter -- } @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "SwAny", propOrder = { "content" }) public class SAA_SwAny implements Serializable { private final static long serialVersionUID = 1L; @XmlMixed @XmlAnyElement protected List<Object> content; } I have another XSD which I have marshalled and generated POJO objects like below @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Header", propOrder = { "fr", "to" }) public class Header implements Serializable { private final static long serialVersionUID = 1L; @XmlElement(name = "Fr", required = true) protected PartyChoice__1 fr; @XmlElement(name = "To", required = true) protected PartyChoice__1 to; -- getter & setter -- } In my class where I marshall, I create like below and marshall Header header = new Header(); header.setFr(fr); header.setTo(to); Root1 **pdu** = new Root1(); **pdu**.setRevision("rev"); SAA_SwAny any = new SAA_SwAny(); any.getContent().add(header); Marshaller mars = cfgsvc.createMarshaller(jaxbCtx, true, "UTF8", false, localPart); String schemaLoc = cfgsvc.findSchemaLoc(localPart); JAXBElement<?> elm = new JAXBElement(xmlQName, docCls, **pdu**); sw = new StringWriter(); mars.marshal(elm, sw);` 按照上面的代码执行时,遇到下面的异常 原因:com.sun.istack.SAXException2:无法将类型“com.test.Header”封送为元素,因为它缺少 @XmlRootElement 注释 在 com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:225) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:274) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:78) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:101) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:293) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:619) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:114) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:293) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:619) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:114) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:98) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:127) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:244) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:251) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:33) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:461) ~[jaxb-impl-2.0.1.jar:2.0.1] 在 com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:292) ~[jaxb-impl-2.0.1.jar:2.0.1] The workaround i did was in the header class added the below code **@XmlRootElement(name = "header", namespace = "head.namespace")** @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Header", propOrder = { "fr", "to" }) public class Header implements Serializable { private final static long serialVersionUID = 1L; @XmlElement(name = "Fr", required = true) protected PartyChoice__1 fr; @XmlElement(name = "To", required = true) protected PartyChoice__1 to; -- getter & setter -- } now the xml marshaller works as expected and i get the below xml <?xml version="1.0" encoding="UTF8" standalone="yes"?> <PDU xsi:schemaLocation="...." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Revision>rev</Revision> <Body> <head:Hdr> <head:Fr> <head:Id> <head:InstnId> <head:FI>AAAASGSGXXX</head:FI> </head:InstnId> </head:Id> </head:Fr> <head:To> <head:Id> <head:InstnId> <head:FI>AAAASGSGXXX</head:FI> </head:InstnId>`your text` </head:Id> </head:To> </head:Hdr> </Body> </PDU> 我期待一个无需手动添加 @xmlrootelement 的解决方案。 JAXB 有办法解决这个问题吗? 假设您正在使用像以前的 maven-jaxb2-plugin 这样的工具,并使用 jaxb api 3+ (雅加达版本),您可以使用以下绑定文件告诉 xjc 在生成的每个类上添加 @XmlRootElement (有趣的是部分是<xjc:simple/>) <?xml version="1.0" encoding="UTF-8"?> <jxb:bindings xmlns:jxb="https://jakarta.ee/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jxb:extensionBindingPrefixes="xjc" jxb:version="3.0"> <jxb:globalBindings> <xjc:simple/> </jxb:globalBindings> </jxb:bindings> 希望对你有帮助。 我说的是以前的maven-jaxb2-plugin,因为该插件在最新版本中被重命名(查看迁移指南)

回答 1 投票 0

如何使用 XSD 基于属性值约束 XML 元素内容类型

我有以下xml文件: 8043501d8766ee1199370022482955e0 我有以下 xml 文件: <doc id="JOURNAL/otai/04.03/product/root"> <field name="name1">8043501d8766ee1199370022482955e0</field> <field name="name2">false</field> <field name="name3">2023-10-09T093500Z</field> </doc> 我需要创建一个 XSD 文件来检查 xml 文件的有效性,还需要根据 name 属性的值检查每个字段元素的内容类型。 例如: 8043501d8766ee1199370022482955e0 的内容类型为 string。 false 的内容类型为 boolean。 2023-10-09T093500Z 的内容类型为 date。 如果字段节点内容类型与这些类型不匹配,XSD 应该抛出错误,例如,whatever 应该抛出错误,因为“whatever”不能转换为布尔值,等等。 在验证输入 xml 时,XSD 应该如何执行这些检查? 谢谢! 我尝试了很多方法,但没有一个有效。 我正在尝试使用类型替代架构组件,但我无法使其工作。 这是我尝试过的: <?xml version="1.0" encoding="utf-8"?> <!-- Created with Liquid Technologies Online Tools 1.0 (https://www.liquid-technologies.com) --> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="doc"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="field"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="name" use="required" > <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="name1"/> <xs:enumeration value="name2"/> <xs:enumeration value="name3"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="copyTo" type="xs:string" use="optional" /> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:alternative test="@name='name2'"> <xs:element name="field" type="xs:boolean"/> </xs:alternative> </xs:element> </xs:sequence> <xs:attribute name="id" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:schema> 如果我尝试验证 xml,则会收到以下错误: s4s-elt-must-match.1:“field”的内容必须匹配(annotation?,(simpleType | complexType)?,(unique | key | keyref)*))。发现问题始于:替代方案。 我希望 XSD 根据 name 属性的值验证字段元素的内容。 例如仅当字段元素内容可以解析为布尔值时,以 name2 作为名称属性值的字段元素才有效。 请尝试以下使用条件类型分配 (CTA) 的 XSD 1.1。 XML <doc id="JOURNAL/otai/04.03/product/root"> <field name="name1">8043501d8766ee1199370022482955e0</field> <field name="name2">false</field> <field name="name3">2023-10-09T09:35:00Z</field> </doc> XSD 1.1 <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="doc"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="field"/> </xs:sequence> <xs:attribute name="id" use="required"/> </xs:complexType> </xs:element> <xs:element name="field" type="xs:anySimpleType"> <xs:alternative test="@name eq 'name1'" type="StringType"/> <xs:alternative test="@name eq 'name2'" type="BooleanType"/> <xs:alternative test="@name eq 'name3'" type="DateTimeType"/> <xs:alternative type="xs:error"/> </xs:element> <xs:complexType name="StringType"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="name" use="required" type="NameAttrType"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name="BooleanType"> <xs:simpleContent> <xs:extension base="xs:boolean"> <xs:attribute name="name" use="required" type="NameAttrType"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:complexType name="DateTimeType"> <xs:simpleContent> <xs:extension base="xs:dateTime"> <xs:attribute name="name" use="required" type="NameAttrType"/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:simpleType name="NameAttrType"> <xs:restriction base="xs:string"> <xs:whiteSpace value="preserve"/> <xs:maxLength value="100"/> <xs:enumeration value="name1"/> <xs:enumeration value="name2"/> <xs:enumeration value="name3"/> </xs:restriction> </xs:simpleType> </xs:schema>

回答 1 投票 0

无法在 XSD 中使用 Assert 元素

我是 XSD 架构验证的新手。我正在寻找适用于 XSD 架构的 if else 条件。在互联网上进行了大量搜索后,我发现了“assert”元素,我们可以在其中测试条件

回答 1 投票 0

XML 架构 - maxOccurs="unbounded" 的元素包含多个可接受的类型

是否可以为 maxOccurs="unbounded" 的元素创建 XSD 架构,该元素接受不同的值类型作为其项目?例如: 首先

回答 3 投票 0

有没有办法使用 xsd 或 xsd2Code 生成单独的 xml 元素属性而不是集体属性

我正在尝试使用 xsd 或 xsd2code 从 XSD 文件生成 C# 类。 XSD 文件来自第三方,无法修改。 它确实生成类,但它们包含这样的块。 [

回答 1 投票 0

从 XSD 解组 XML 失败,JAR 执行显示“java.io.IOException:缓冲区已关闭”

我有一个java代码,可以从PDF(Apache PDFBox)中提取Xml部分并将其解组为java类。 在使用 IntelliJ 进行本地执行时,一切正常,但是当我在 openshift 集群上部署 jar 时...

回答 1 投票 0

我的 xslt 2.0 中没有索引的段的分组问题

我尝试完成以下结构: 000010 ...

回答 1 投票 0

JaxB 编组键、值对,其中值可以是另一个键、值对

我有这个对象,作为复杂对象的节点: 公共类参数实现可序列化 { @XmlElement(名称 = "键") 受保护的字符串键; @XmlElement(名称 = "值")

回答 1 投票 0

XSD 唯一性约束

我正在尝试为下面的示例 xml 文件生成 XSD。我们的想法是生成此文件并作为自动化的一部分对其进行验证。 我正在尝试为下面的示例 xml 文件生成 XSD。我们的想法是生成此文件并验证它作为自动化的一部分。 <?xml version="1.0" encoding="UTF-8"?> <CustomLabels xmlns="http://soap.sforce.com/2006/04/metadata"> <labels> <fullName>Label1</fullName> <categories>L1</categories> <language>en_US</language> <protected>false</protected> <shortDescription>This is label 1</shortDescription> <value>1</value> </labels> <labels> <fullName>Label2</fullName> <categories>L2</categories> <language>en_US</language> <protected>false</protected> <shortDescription>Label 2 </shortDescription> <value>2</value> </labels> <labels> <fullName>Label2</fullName> <categories>L2</categories> <language>en_US</language> <protected>false</protected> <shortDescription>New label</shortDescription> <value>New value</value> </labels> </CustomLabels> 到目前为止我生成的xsd是: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://soap.sforce.com/2006/04/metadata" targetNamespace="http://soap.sforce.com/2006/04/metadata" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="CustomLabels"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="labels"> <xs:complexType> <xs:sequence> <xs:element name="fullName" type="xs:string"/> <xs:element name="categories" type="xs:string" minOccurs="0"/> <xs:element name="language" type="xs:string"/> <xs:element name="protected" type="xs:boolean" minOccurs="0"/> <xs:element name="shortDescription" type="xs:string" minOccurs="0"/> <xs:element name="value" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:unique name="fullname_unique"> <xs:selector xpath="labels/fullName"/> <xs:field xpath="."/> </xs:unique> </xs:element> </xs:schema> 我已经对 fullName 进行了唯一性检查,但这似乎不起作用。有人可以解释这里的问题是什么并指导如何实现这一目标吗? 您的元素位于命名空间中,XPath 表达式需要反映这一点。使用 <xs:selector xpath="p:labels/p:fullName"/> 并将 xmlns:p="http://soap.sforce.com/2006/04/metadata" 添加到 xs:schema 元素。

回答 1 投票 0

Jackson:从 XSD 生成 Jackson 类

与 JAXB 为给定 XSD 生成 JAXB 类类似,Jackson 是否提供任何实用程序来从 XSD 或 JSON 生成 Jackson 类。 JAXB 类生成器已为 XSD 生成了一组类...

回答 1 投票 0

如何在 xml 模式中使用序列和非序列子级

1。我有一个格式良好的 xml,如下所示 g0 测试 a ...

回答 1 投票 0

如何在 xml 模式中使用序列和非序列子代

1。我有一个格式良好的 xml,如下所示 g0 测试 a ...

回答 1 投票 0

XML 文档未根据 XSD 架构进行验证

我有以下 XML 架构: 我有以下 XML 架构: <?xml version="1.0" encoding="utf-16"?> <xs:schema xmlns:tns="http://www.orbis-software.com/WebSvcCon" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.orbis-software.com/WebSvcCon" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="totalResults" type="xs:unsignedShort" /> <xs:element maxOccurs="unbounded" name="summaries"> <xs:complexType> <xs:sequence> <xs:element name="itemIdentifier"> <xs:complexType> <xs:sequence> <xs:element name="sku" type="xs:string" /> <xs:element name="id" type="xs:decimal" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="qualifier" /> <xs:element name="totalReceived" type="xs:decimal" /> <xs:element name="allocated" type="xs:decimal" /> <xs:element name="available" type="xs:decimal" /> <xs:element name="onHold" type="xs:decimal" /> <xs:element name="onHand" type="xs:decimal" /> <xs:element name="facilityId" type="xs:unsignedByte" /> </xs:sequence> <xs:attribute name="Array" type="xs:boolean" use="required" /> </xs:complexType> </xs:element> <xs:element name="_links"> <xs:complexType> <xs:sequence> <xs:element name="self"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="href" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="next"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="href" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="prev"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="href" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> 我正在验证的特定 XML 文档中没有“下一个”字段(尽管某些文档可以)。当我加载此文档时,我收到错误: Error validating source XML against schema - The element '_links' in namespace 'http://www.orbis-software.com/WebSvcCon' has invalid child element 'prev' in namespace 'http://www.orbis-software.com/WebSvcCon'. List of possible elements expected: 'next' in namespace 'http://www.orbis-software.com/WebSvcCon'. 根据 XSD,“下一个”元素设置为 minOccurs=0 使其成为可选,那么为什么我收到错误? 在您的架构中,_links元素的内容在中定义 <xs:element name="_links"> <xs:complexType> <xs:sequence> <xs:element name="self"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="href" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="next"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="href" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="prev"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="href" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> 作为三个元素的序列,即self、next和prev。这些元素都不是可选的,因为它们都没有 mixOccurs="0",每个元素的内容上只有 mixOccurs="0",因为它们可以包含 0 到无界 href 元素。 所以 <_links><self/><next/><prev/></_links> 是可能的,但你不能忽略这三个元素中的任何一个。

回答 1 投票 0

我可以使用 python 库“xmlschema”从头开始创建 XML 文档吗?

有一些模式定义文件(xsd)。可以使用 xmlschema 库读取它们。我可以使用它来验证或转换一些现有的 XML 文档。没事儿。 但我必须创造整个...

回答 2 投票 0

XSD 1.0 中一个元素具有两种不同的定义/类型

我必须编写一个 XML 模式(在 XSD 1.0 中)来验证给定的文档。 在本文档中,有一个名为 box 的元素,它可以: 有两个必需的属性,名称和重量以及其他一些

回答 1 投票 0

JAXB 避免从 XSD 生成重复类

我有一个 xsd,其中有一个名为 toc 的元素在 xsd 中两次。它会导致 java 类生成错误。现在,我想编写 xml 绑定来解决这个问题。 我有一个 xsd,其中有一个名为 toc 的元素在 xsd 中两次。它会导致 java 类生成错误。现在,我想编写 xml 绑定来解决这个问题。 <jaxb:bindings schemaLocation="../DMS_Dokument.Versenden_response.xsd"> <jaxb:bindings node="xsd:element[@name='toc']"> <jaxb:factoryMethod name="TOC"/> </jaxb:bindings> </jaxb:bindings> 我得到的错误是 原因:无法解析schema。应该提供错误消息 为了避免 JAXB 从 XSD 生成重复的类,您可以使用本地或外部绑定为生成的类定义不同的名称。 <jaxb:bindings node="XPATH"> <jaxb:class name="YourDistinctName"/> </jaxb:bindings> Java 类名重复的一个原因是在全局绑定中使用 toplevel 作用域。 注意: localScoping 属性的值可以是 nested 或 toplevel。此属性描述嵌套 XML 模式组件与嵌套模式派生的 JAXB 类或顶级模式派生的 JAXB 类的 JAXB 绑定。为了避免嵌套组件之间的命名冲突,该属性的默认值是嵌套的。当模式组件嵌套太深或应用程序不希望使用嵌套类或使用 JPA 时(JPA 第 2.1 节,实体必须是顶级类),开发人员可以将 localScoping 自定义为 toplevel。 例如,下载此演示 (zip) 并考虑其 XML 架构 trilogy.xsd,该架构对 Trilogy 书籍进行建模。它在根 trilogy 元素上定义一个 TOC,并为每个 book 定义另一个 TOC。该架构将每个 TOC 定义为匿名类型,并且每个 TOC 都有不同的用途。第一个目录描述了三本书的标题,但第二个目录是每本书的章节列表。两者具有相同的元素名称 <toc>...</toc>,如该 XML 实例 trilogy.xml 所示,但需要不同的 Java 类定义。 当模式被定制为使用 <jaxb:globalBindings localScoping=”toplevel”/> 时,JAXB 会尝试根据一个元素名称生成两种类型,这会导致名称冲突。 为了解决 Java 类名重复问题,演示使用 HiSrc BasicJAXB 项目中的工具来扫描 XSD 并输出这些建议的绑定:trilogy.xjb。例如,这是书 TOC 的装订: <jaxb:bindings node="//xs:element[@name='trilogy']/xs:complexType/xs:sequence/xs:element[@name='book']/xs:complexType/xs:sequence/xs:element[@name='toc']/xs:complexType"> <jaxb:class name="TrilogyBookTocType"/> </jaxb:bindings> 绑定使用 XPATH 选择目标节点,并将 Java 类名称声明为 TrilogyBookTocType。 演示提供了一个 bash 脚本来运行该工具,但它可以像这样手动运行... java -cp \ $HOME/.m2/repository/org/patrodyne/jvnet/hisrc-basicjaxb-tools/2.1.1/hisrc-basicjaxb-tools-2.1.1.jar \ org.jvnet.basicjaxb.util.CreateToplevelXJBindings \ --nested src/main/resources/trilogy.xsd 该工具将其输出发送到 stdout,您可以在其中将其复制/粘贴到绑定文件或架构中。 执行 该演示是一个独立的 Maven 项目。您可以使用以下命令运行测试: mvn -Ptest clean test mvn -Pexec compile exec:java 方法 hisrc-higherjaxb-maven-plugin 配置为使用提供的 trilogy.xsd 模式和绑定文件 trilogy.xjb 生成 JAXB 类。该模式提供了命名空间 "http://org.example/trilogy",JAXB 使用它来使用自己的命名约定创建 Java package 名称。 作为一个选项,可以使用这些 XJC hisrc-basicjaxb-plugins 生成 Java 内置 Object 方法的更高级实现。特别是,示例项目使用 toString 插件来显示未编组的 Trilogy 对象的人类可读表示。 hisrc-basicjaxb-插件 <args> <arg>-no-header</arg> <arg>-XhashCode</arg> <arg>-Xequals</arg> <arg>-XtoString</arg> </args> 注意: 使用 XJC hisrc-basicjaxb-plugins 时,运行时类路径需要 hisrc-basicjaxb-runtime 依赖。 测试 JUnit 测试类 TrilogyTest.java 扫描示例文件并调用方法 checkSample(File sample) 将每个文件提供给测试人员。对于此项目,创建了一个 JAXBContext,并且 samples 路径中的每个文件都被 unmarshaled 为 Trilogy 对象。成功后,每个对象都会被编组以用于日志记录和您的审查。 示范 具有 main(...) 方法的 Java 标准引擎应用程序位于 org.example.trilogy.Main。该应用程序使用以下命令执行: mvn -Pexec compile exec:java -Dexec.args="src/test/samples/trilogy.xml" 免责声明:我是这些HiSrc项目的维护者。

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.