XSD通常是指以W3C XML Schema格式编写的文档,其中包含特定类型的XML文档的描述。
Symfony Serializer xml,按顺序包含复杂的 xsd 类型
我收到以下 XSD: 我收到以下 XSD: <xsd:complexType name="typeADDRESS"> <xsd:sequence> <xsd:element ref="NAME" minOccurs="0" maxOccurs="unbounded"/> <!-- # ... just to show that these aren't the only ones --> <xsd:sequence minOccurs="0" maxOccurs="unbounded"> <xsd:element ref="EMAIL"/> <xsd:element ref="PUBLIC_KEY" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> <!-- # ... and also some attributes later --> </xsd:sequence> </xsd:complexType> 如果电子邮件元素的 XML 数据如下所示: <EMAIL>A</EMAIL> <PUBLIC_KEY>A1</PUBLIC_KEY> <PUBLIC_KEY>A2</PUBLIC_KEY> <EMAIL>B</EMAIL> <PUBLIC_KEY>B1</PUBLIC_KEY> <PUBLIC_KEY>B2</PUBLIC_KEY> 如何将其放入有意义的 PHP 结构中? 当正常化回来时,我如何保持订单? 我需要使用NormalizedInterface、DenormalizedInterface吗? 其他属性又如何,我是否也需要手动(去)规范化它们? 在大多数 API 中处理此类结构是很棘手的。我首先使用 XSLT 将数据转换为更规则的结构: <xsl:for-each-group select="*" group-starting-with="EMAIL"> <ENTRY email="{EMAIL}"> <xsl:copy-of select="PUBLIC_KEY"/> </ENTRY> </xsl:for-each-group> 这会将其变成: <ENTRY email="A"> <PUBLIC_KEY>A1</PUBLIC_KEY> <PUBLIC_KEY>A2</PUBLIC_KEY> </ENTRY> <ENTRY email="B"> <PUBLIC_KEY>B1</PUBLIC_KEY> <PUBLIC_KEY>B2</PUBLIC_KEY> </ENTRY> 作为一般原则,如果您的 XML 格式难以处理,最好在处理的第一阶段将其清理,以避免使实际应用程序的逻辑复杂化。
我试图从 XML 模式生成一个 C# 类,但没有成功。 这是 VS 2017 的开发人员命令提示符中的命令: xsd 发票Api.xsd /类 输出: c: emp est>xsd invo...
下面是 xml 示例。 下面是 xml 示例。 <Custom> <Entry Key="ClientApp.DataContext.JobId" Type="String" Value="105161"></Entry> <Entry Key="ClientApp.DataContext.JobNumber" Type="String" Value="PCSQ test"></Entry> <Entry Key="Abstract" Type="String" Value="Emsur"></Entry> <Entry Key="TempID" Type="String" Value="12345"></Entry> <Entry Key="Lot" Type="String" Value="6789"></Entry> </Custom> 以下是 Visual Studio 2019 自动生成的 XSD。 <xs:element name="Custom"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="Entry"> <xs:complexType> <xs:attribute name="Key" type="xs:string" use="required" /> <xs:attribute name="Type" type="xs:string" use="required" /> <xs:attribute name="Value" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> 上下文: 生成的 XSD 表示所有属性(键、值、类型)都是必需的。我们强制需要 Key="Abstract" 及其 Value="Emsur" & Key="TempID" 及其 Value="12345"。其他属性(如 ClintApp.JobId 和 ClientApp.JobNumber)是可选的。 问题: 如何验证摘要是否具有价值且批次是否具有价值,同时保留其他属性为可选? 谢谢。 XSD 1.1 断言: <xs:element name="Custom"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="Entry"> <xs:complexType> <xs:attribute name="Key" type="xs:string" use="required" /> <xs:attribute name="Type" type="xs:string" use="required" /> <xs:attribute name="Value" type="xs:string" use="required" /> </xs:complexType> </xs:element> </xs:sequence> <xs:assert test="some $entry in Entry satisfies $entry/@Key = 'Abstract' and $entry/@Value = 'Emsur'"/> <xs:assert test="some $entry in Entry satisfies $entry/@Key = 'TempID' and $entry/@Value = '12345'"/> </xs:complexType> </xs:element>
我将 XSD 文件加载到空数据集中,将数据加载到数据集中,然后使用该数据集编写 XML 文件。 问题是 XSD 的序列类型是否包含
JAXB xjc:解决从 AUTOSAR XSD 生成类时的非法类继承循环
我正在使用 JAXB 的 xjc 工具从 AUTOSAR XSD 文件生成 Java 类,并遇到了 IllegalArgumentException,指示非法的类继承循环。这是我的错误消息
如何防止 XSD.EXE 在生成的 C# 中将嵌套类型折叠为交错数组?
考虑以下 XSD: 考虑以下 XSD: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="ContainingClass" type="ContainingClass" /> <xs:complexType name="ContainingClass"> <xs:sequence> <xs:element name="OuterArrayContainer" type="OuterArrayContainer" /> </xs:sequence> </xs:complexType> <xs:complexType name="OuterArrayContainer"> <xs:sequence> <xs:element minOccurs="1" maxOccurs="10" name="OuterArray" type="InnerArrayContainer" /> </xs:sequence> </xs:complexType> <xs:complexType name="InnerArrayContainer"> <xs:sequence> <xs:element minOccurs="1" maxOccurs="10" name="InnerArray" type="xs:int" /> </xs:sequence> </xs:complexType> </xs:schema> 假设上面的 XSD 位于名为“test.xsd”的文件中,我可以运行以下命令为其创建 C# 包装器: xsd test.xsd /c C# 输出如下所示(为简洁起见,删除 XML 属性后): public partial class ContainingClass { private int[][] outerArrayContainerField; public int[][] OuterArrayContainer { get { return this.outerArrayContainerField; } set { this.outerArrayContainerField = value; } } } 如您所见,它完全丢失了内部类型,并用单个锯齿状 int 数组替换了它们。我想保留内部类型。 如果我像这样向 XSD 添加虚拟元素: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="ContainingClass" type="ContainingClass" /> <xs:complexType name="ContainingClass"> <xs:sequence> <xs:element name="OuterArrayContainer" type="OuterArrayContainer" /> </xs:sequence> </xs:complexType> <xs:complexType name="OuterArrayContainer"> <xs:sequence> <xs:element minOccurs="1" maxOccurs="10" name="OuterArray" type="InnerArrayContainer" /> <xs:element name="Dummy" type="xs:int" /> </xs:sequence> </xs:complexType> <xs:complexType name="InnerArrayContainer"> <xs:sequence> <xs:element minOccurs="1" maxOccurs="10" name="InnerArray" type="xs:int" /> <xs:element name="Dummy" type="xs:int" /> </xs:sequence> </xs:complexType> </xs:schema> 那么输出是: public partial class ContainingClass { private OuterArrayContainer outerArrayContainerField; public OuterArrayContainer OuterArrayContainer { get { return this.outerArrayContainerField; } set { this.outerArrayContainerField = value; } } } public partial class OuterArrayContainer { private InnerArrayContainer[] outerArrayField; private int dummyField; public InnerArrayContainer[] OuterArray { get { return this.outerArrayField; } set { this.outerArrayField = value; } } public int Dummy { get { return this.dummyField; } set { this.dummyField = value; } } } public partial class InnerArrayContainer { private int[] innerArrayField; private int dummyField; public int[] InnerArray { get { return this.innerArrayField; } set { this.innerArrayField = value; } } public int Dummy { get { return this.dummyField; } set { this.dummyField = value; } } } 这保留了内部类型,但代价是拥有未使用的虚拟属性。 我的问题是:有没有办法在不引入虚拟元素的情况下执行此操作(并且无需手动编辑输出 C# 代码)? (完全有可能我正在以完全错误的方式处理这件事......) 我的问题是:有没有办法在不引入虚拟元素的情况下执行此操作(并且无需手动编辑输出 C# 代码)? 简短的回答是否定的。在这个特定的实例中,这似乎是 XSD.exe 的一个错误,但即便如此,它通常对复杂类型的支持仍然很差,因为它生成的代码很大程度上是面向序列化/反序列化的,而不是面向模式的,因此它只付出了最小的努力来建模模式语义。 我建议使用另一个名为 'dotnet-xscgen' 的工具,来自 https://github.com/mganss/XmlSchemaClassGenerator(查看有关如何安装/使用它的说明此处) 它生成的代码仍然与 XSD.exe 非常相似(即 XmlSerializer 兼容),但有很大改进。运行原始架构(没有虚拟元素)时,它会生成以下代码(为了简洁起见,我删除了所有属性): // This code was generated by XmlSchemaClassGenerator version 2.1.1057.0 using the following command: // xscgen schema.xsd --namespace=Default public partial class ContainingClass { private System.Collections.ObjectModel.Collection<InnerArrayContainer> _outerArrayContainer; public System.Collections.ObjectModel.Collection<InnerArrayContainer> OuterArrayContainer { get { return _outerArrayContainer; } private set { _outerArrayContainer = value; } } /// <summary> /// <para xml:lang="en">Initializes a new instance of the <see cref="ContainingClass" /> class.</para> /// </summary> public ContainingClass() { this._outerArrayContainer = new System.Collections.ObjectModel.Collection<InnerArrayContainer>(); } } public partial class OuterArrayContainer { private System.Collections.ObjectModel.Collection<InnerArrayContainer> _outerArray; public System.Collections.ObjectModel.Collection<InnerArrayContainer> OuterArray { get { return _outerArray; } private set { _outerArray = value; } } /// <summary> /// <para xml:lang="en">Initializes a new instance of the <see cref="OuterArrayContainer" /> class.</para> /// </summary> public OuterArrayContainer() { this._outerArray = new System.Collections.ObjectModel.Collection<InnerArrayContainer>(); } } public partial class InnerArrayContainer { private System.Collections.ObjectModel.Collection<int> _innerArray; public System.Collections.ObjectModel.Collection<int> InnerArray { get { return _innerArray; } private set { _innerArray = value; } } /// <summary> /// <para xml:lang="en">Initializes a new instance of the <see cref="InnerArrayContainer" /> class.</para> /// </summary> public InnerArrayContainer() { this._innerArray = new System.Collections.ObjectModel.Collection<int>(); } } 微软似乎对改进 XML 工具不感兴趣,因此其他人已经填补了这个空缺。
我有一个 XSD 文件(我无法修改),它定义了如下所示的 attributeGroup 我有一个 XSD 文件(我无法修改),它定义了如下所示的 attributeGroup <xs:attributeGroup name="myAttributes"> <xs:attribute name="name" type="name_t" use="required"/> <xs:attribute name="age" type="age_t" use="required"/> </xs:attributeGroup> 比如说,我希望这个 attributeGroup 有另一个名为“性别”的属性。由于我无法修改此 xsd,因此我定义了一个新的 XSD 并将此 XSD 包含在那里。 但是如何将这个新属性添加到 myAttributes 组中? 所以有2个选择。 选项 A 是最简单的方法,即将第一个 XSD 包含或导入到第二个 XSD 中,然后将第一个属性组包含在您定义的新属性组中。 对于选项 A,以下是 XSD 的完整 XML 和示例 XML: 第一个.xsd: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:attributeGroup name="myAttributes"> <xs:attribute name="name" type="name_t" use="required"/> <xs:attribute name="age" type="age_t" use="required"/> </xs:attributeGroup> <xs:simpleType name="name_t"> <xs:restriction base="xs:string"/> </xs:simpleType> <xs:simpleType name="age_t"> <xs:restriction base="xs:int"/> </xs:simpleType> </xs:schema> 第二个.xsd: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:include schemaLocation="First.xsd"/> <xs:attributeGroup name="extendedMyAttributes"> <xs:attributeGroup ref="myAttributes"/> <!-- New attribute --> <xs:attribute name="gender" type="xs:string"/> </xs:attributeGroup> </xs:schema> 现在您可以在元素定义中使用新的扩展属性组: <xs:element name="person"> <xs:complexType> <xs:attributeGroup ref="extendedMyAttributes"/> </xs:complexType> </xs:element> 示例 XML 将如下所示: <?xml version="1.0" encoding="UTF-8"?> <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Second.xsd" gender="male" name="Adam" age="20"> </person> 这样就可以验证了。 选项 B 将覆盖 myAttributes 属性组的现有定义,而不使用 <xs:override> 元素创建具有新名称的新属性组。这允许您继续将属性组引用为 myAttributes,而不是新名称。 这是覆盖 myAttributes 的架构。 <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:override schemaLocation="First.xsd"> <xs:attributeGroup name="myAttributes"> <xs:attribute name="name" type="name_t"/> <xs:attribute name="age" type="age_t"/> <!-- New gender attribute --> <xs:attribute name="gender" type="xs:string"/> </xs:attributeGroup> </xs:override> <xs:element name="person"> <xs:complexType> <xs:attributeGroup ref="myAttributes"/> </xs:complexType> </xs:element> </xs:schema> 因为您只是向现有组添加新属性(并保留第一个组的属性),所以只需创建一个包含第一个属性组的新属性组就足够了。 比较这两个选项,选项 A 也“更安全”,从某种意义上说,如果第一个架构的新版本更新,您可以参考更新的 XSD 并保留原始属性组中的任何新的或更新的属性。使用选项 B,除了新的 name 属性之外,您还必须复制覆盖的属性组定义中的 age 和 gender 属性。 当您想要执行完全重命名、删除属性等操作时,您可能会想要覆盖某些内容。唯一基本保持不变的是属性组的名称。 您可以阅读有关覆盖的更多信息:https://www.w3.org/TR/xmlschema11-1/#override-schema
XSD 本身验证与 XML 验证器针对 XSD 架构的验证差异
我试图了解验证 XSD 文件本身和根据 XSD 架构验证 XML 之间的区别。我看到有两个概念,但我不知道应该使用哪一个...
好的。我想为 xmllint 设置目录文件来修复问题,以便从本地文档验证 dcterms xml 命名空间。我相信我所做的一切都是正确的,但事实并非如此......
在测试环境中调用 Sabre PassengerDetailsRQ,我们收到了意想不到的标签,例如 TransactionInfo 中的“PricedLocation”。还有其他意想不到的标签。例如: 在测试环境中调用 Saber PassengerDetailsRQ,我们收到了意外的标签,例如 'PricedLocation' 内的 TransactionInfo。还有其他意想不到的标签。例如: <PricedLocation countryCode='IT'>MIL</PricedLocation> <TicketedLocation countryCode='IT'>MIL</TicketedLocation> <PricingQualifiers> <Qualifier> <ActionCode>WP</ActionCode> </Qualifier> <Qualifier mergeAllowed='true'> <ActionCode>P</ActionCode> <Data>1ADT</Data> </Qualifier> <Qualifier> <ActionCode>RQ</ActionCode> </Qualifier> </PricingQualifiers> <TicketByDate>2023-07-13T00:00:00</TicketByDate> 我们使用的是3.4.0版本。 有人知道为什么吗? 查看 xsd 我们应该只收到这些标签: <xs:element name="TransactionInfo"> <xs:annotation> <xs:documentation>Data at PQ transaction level</xs:documentation> </xs:annotation> <xs:complexType> <xs:sequence> <xs:element name="CreateDateTime" type="xs:dateTime"> <xs:annotation> <xs:documentation>System Date/time the PQ was created Ref: DM0Z_65_CLDB and DM0Z_65_CLTB</xs:documentation> </xs:annotation> </xs:element> <xs:element name="UpdateDateTime" type="xs:dateTime" minOccurs="0"> <xs:annotation> <xs:documentation>System Date/time the PQ was updated. Ref: DM0Z_65_ULDB and DM0Z_65_ULTB</xs:documentation> </xs:annotation> </xs:element> <xs:element name="LastDateToPurchase" type="xs:dateTime" minOccurs="0"> <xs:annotation> <xs:documentation>Time Stamp for Last Date by when the PQ has to be purchased. Ref:DM0Z_40_TMST</xs:documentation> </xs:annotation> </xs:element> <xs:element name="LocalCreateDateTime" type="xs:dateTime" minOccurs="0"> <xs:annotation> <xs:documentation>Local Create Date/time the PQ was updated. Ref: SR06PQ-20_CLDB/CTIM</xs:documentation> </xs:annotation> </xs:element> <xs:element name="LocalUpdateDateTime" type="xs:dateTime" minOccurs="0"> <xs:annotation> <xs:documentation>Local Update Date/time the PQ was updated. Ref: SR06PQ-20_ULDB/ULTB</xs:documentation> </xs:annotation> </xs:element> <xs:element name="ExpiryDateTime" type="xs:dateTime" minOccurs="0"> <xs:annotation> <xs:documentation>Price quote expiry Date/time the PQ. Ref: DM0Z_40_PXDT/DM0Z_40_PXTM</xs:documentation> </xs:annotation> </xs:element> <xs:element name="InputEntry" minOccurs="0"> <xs:annotation> <xs:documentation>Entry made to update the price quote. Ref: DM0Z_60_TYPE #DM0Z_60_PRI #DM0Z_60_MAN</xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="1" /> <xs:maxLength value="255" /> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> 我面临着同样的问题,只是想知道你是否找到了答案?
我找到了这个工具。 CXSD 在他们的文档中:cxsd 是一个用于 Node.js 和(可选但强烈推荐)TypeScript 的流式 XSD 解析器和 XML 解析器生成器。 这正是我所需要的,...
如何在没有中间容器类的情况下使用jaxb映射各种类型的对象列表?
我有这个架构: 我有这个架构: <xs:element name="document" type="Document/> <xs:complexType name="Document"> <xs:sequence> <xs:element name="description" type="xs:string" minOccurs="0"/> <xs:element name="destination" type="xs:string" minOccurs="0"/> <xs:element name="tags" type="TagList" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:complexType name="TagList"> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:any processContents="lax" namespace="http://www.example.com/schema/tags"/> </xs:choice> </xs:complexType> 此架构支持以下 XML: <document> <description>the description</description> <destination>the destination</destination> <tags> <tagA> <propA1>...</propA1> <propA2>...</propA2> ... </tagA> <tagB> <propB1>...</propB1> <propB2>...</propB2> ... </tagB> ... </tags> </document> 由 tags 表示的列表包含 0+ 个在单独模式中定义的各种标签类型的元素。 当我使用 xjc 从该模式生成 Java 类时,我得到以下输出: public class Document { private String description; private String destination; private TagsList tags; // getter/setter } public class TagsList { private List<Object> any; // getter/setter } 这意味着我必须输入 document.getTags().getAny() 才能访问标签项。有没有办法生成一个直接包含 DocumentClass 字段作为 tags 的 List<Object>,如下所示: public class Document { private String description; private String destination; private List<Object> tags; // getter/setter } 注意:在 choice 中从 sequence 更改为 TagsList 没有区别。 根据您从 XSD 生成 Java 类的方式,您应该尝试添加可用的现有 XEW 插件之一(这是撰写本文时最先进的插件:https://github.com/dmak/jaxb-xew-插件) 我建议您阅读文档以便做您想做的事情。 这是基于 jaxb-tools maven-plugin 的示例配置: <plugin> <groupId>org.jvnet.jaxb</groupId> <artifactId>jaxb-maven-plugin</artifactId> <version>correct version according targeted JAXB api</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>generate</goal> </goals> <configuration> <extension>true</extension> <args> <arg>-Xxew</arg> </args> <plugins> <plugin> <groupId>com.github.jaxb-xew-plugin</groupId> <artifactId>jaxb-xew-plugin</artifactId> <version>correct version according JAXB api</version> </plugin> </plugins> </configuration> </execution> </executions> </plugin>
如何使用 schemaLocation 或 noNamespaceSchemaLocation 将 XML 链接到 XSD?
我找到了一些解决这个问题的提示,但仍然没有帮助我。 这是我的 XML 我找到了一些解决这个问题的提示,但仍然没有帮助我。 这是我的 XML <?xml version="1.0" encoding="UTF-8"?> <work xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.w3.org/2001/XMLSchema-instance" tns:schemaLocation="myXSDSchema.xsd"> <tns:Objects> <tns:Object Name=":" Location=":"> </tns:Object> </tns:Objects> </work> 这是我的 XSD 文件: <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns = "http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> (some checks) </schema> 我的 XSD 文件与 XML 位于同一文件夹中。 如何链接这两个文件? 如何将 XSD 链接到 XML 文档取决于 XML 文档是否使用命名空间... 没有命名空间 使用 xsi:noNamespaceSchemaLocation 提供有关要使用的 XSD 的提示: 文档.xml: <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="example.xsd"> <!-- ... --> </root> 示例.xsd: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="root"> <!-- ... --> </xsd:element> </xsd:schema> 带有命名空间 使用 xsi:schemaLocation 提供有关要使用的 XSD 的提示: 文档.xml: <ns:root xmlns:ns="http://example.com/ns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://example.com/ns example-ns.xsd"> <!-- ... --> </ns:root> 示例-ns.xsd: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/ns"> <xsd:element name="root"> <!-- ... --> </xsd:element> </xsd:schema>
在 Java 中使用 JAXB 从 XML 反序列化 HashMap
这是我的 XML 内容: 我自己制作的,所以我可以改变它,只是发现这个结构适合我的数据。 道具 ...
如何使用布尔属性定义 XML 模式并使用 JS 验证 XML [重复]
我正在寻找一种根据自定义 XML 模式(XSD 文件)解析 XML 字符串的方法,其中包括布尔属性,例如在 HTML 中使用“选中”或“隐藏”等进行的操作: 我正在寻找一种根据自定义 XML 模式(XSD 文件)解析 XML 字符串的方法,其中包括布尔属性,例如在 HTML 中使用“选中”或“隐藏”等进行的操作: <div checked hidden> hello world </div> 我不能只使用 HTML 和 HTML 解析器,因为我希望能够定义自己的允许布尔属性列表。我无法使用纯 XML,因为纯 XML 根本不允许布尔属性。 有什么方法可以利用带有布尔属性的 XML 吗? 我希望能够在 JavaScript 中完成这一切,但如果绝对必要,我可以使用其他东西。 Java 脚本不存在使用 XSD 对客户端 XML 验证的直接支持。我能找到的最好的客户端是这个用于 java 脚本的第三方库:xmljs。还有一个展示其用法的演示:demo. 对于复杂且更强大的验证,我建议在服务器端进行,使用 Node.js 库(例如 libxmljs)或其他语言的支持,例如 Java 库 Xerces 或 C# 中的 XmlSchemaSet 类。
我正在寻找一种在 XSD 文件中定义 XML 架构的方法,然后使用所述架构来验证存储在字符串中的 XML。我希望能够使用 JavaScript 来完成这一切,因为我...
我只是想知道是否有一个程序可以将 XSD 文件转换为 Python 类,就像 JAXB 对 Java 所做的那样?
我有这个xsd文件: 我有这个xsd文件: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://HIDDEN/Queues" xmlns="http://HIDDEN/Queues"> <xs:complexType name="Queue"> <xs:sequence> <xs:choice> <xs:sequence> <xs:element fixed="1" name="id" type="xs:long"/> <xs:element fixed="a" name="name" type="xs:string"/> </xs:sequence> <xs:sequence> <xs:element fixed="2" name="id" type="xs:long"/> <xs:element fixed="b" name="name" type="xs:string"/> </xs:sequence> </xs:choice> </xs:sequence> </xs:complexType> </xs:schema> 目标是类型为 Queue 的元素应该如下所示: <Queue> <id>1</id> <name>a</name> </Queue> 但是一旦 id 或 name 不匹配(例如 id=2 name=a),它就会失败。 我感到困惑的部分是这个错误: “http://HIDDEN/Queues”:id 和“http://HIDDEN/Queues”:id(或其替换组中的元素)违反“唯一粒子属性”。在针对此模式进行验证期间,这两个粒子将会产生歧义。 我的意思是我看到了它引用的内容,但这些元素不能同时存在,所以不知道如何解决这个问题。 我的一个想法是将 id 和 name 作为属性,但我的老板说我不能这样做(不要问我为什么)。 你们中有人知道其他方法吗? 预先感谢! 这是一个基于 XSD 1.1 的解决方案,它使用 assert 语句来强制执行 id 和 name 值的正确组合。 输入XML <Queue xmlns="http://HIDDEN/Queues"> <id>1</id> <name>a</name> </Queue> XSD 1.1 <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://HIDDEN/Queues" xmlns="http://HIDDEN/Queues" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> <xs:element name="Queue"> <xs:complexType> <xs:sequence> <xs:element ref="id"/> <xs:element ref="name"/> </xs:sequence> <xs:assert test="string-join((xs:string(id), name), '~') = ('1~a', '2~b')" xpathDefaultNamespace="##targetNamespace"> <xs:annotation> <xs:documentation>Rule #: 20-70</xs:documentation> <xs:documentation>Combination of id and name values shall be correct</xs:documentation> </xs:annotation> </xs:assert> </xs:complexType> </xs:element> <xs:element name="id" type="xs:integer"/> <xs:element name="name" type="xs:string"/> </xs:schema>
Java java.lang.ClassCastException:使用 IntelliJ 生成代码时无法强制转换 javax.xml.bind.JAXBElement 异常
我已使用 IntelliJ 工具 > JAXB > 使用 JAXB 从 XML 架构生成 Java 代码从 XSD 创建了 Java 对象... 我基本上是尝试从 XSD 生成 Java 对象,然后读取 XML ...