XSD通常是指以W3C XML Schema格式编写的文档,其中包含特定类型的XML文档的描述。
以下 XSD 定义了复杂类型 Base(指定 block="")和 Derived(扩展 Base 并指定 block="")。 以下 XSD 定义了复杂类型 Base,它指定 block="",以及 Derived,它扩展 Base 并还指定 block=""。 <?xml version="1.0" encoding="utf-8"?> <xs:schema targetNamespace ="http://example.org/scratch-type-substitution" xmlns ="http://example.org/scratch-type-substitution" xmlns:xs ="http://www.w3.org/2001/XMLSchema" blockDefault =""> <xs:complexType name="Base" block=""/> <xs:complexType name="Derived" block=""> <xs:complexContent> <xs:extension base="Base"/> </xs:complexContent> </xs:complexType> <xs:element name="root"> <xs:complexType> <xs:choice maxOccurs="unbounded"> <xs:element name="base" type="Base"/> </xs:choice> </xs:complexType> </xs:element> </xs:schema> 以下实例根据 XSD 有效。 它指定一个 Base 类型元素,该元素通过 Derived: 显式替换为 xsi:type 类型 <pre:root xmlns:pre="http://example.org/scratch-type-substitution" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <base xsi:type="pre:Derived"/> </pre:root> 但是,如果将属性blockDefault="#all"添加到<schema>,则实例将无法验证。 特别是,.NET 8.0 XmlDocument 方法 Load 发出: xsi:type 属性值“http://example.org/scratch-type-substitution:Derived”对于元素“base”无效,因为它不是从架构中的类型有效派生的类型,或者因为它阻止了 xsi:type 派生。 我认为前者不可能是真的。 如果后者是真的,我不明白为什么,因为两种类型的已解析 block 属性值的 PSVI 信息都是“空” - 并且 - 空字符串(或任何值)会覆盖 blockDefault 值. Saxon 模式验证器给出相同的结果。这是错误消息: test.xml 第 5 行第 33 列验证错误:FORG0001: xsi:type 不是从声明的类型有效派生的。推导 请求的类型 Q{http://example.org/scratch-type-substitution}派生被阻止 通过基本类型 Q{http://example.org/scratch-type-substitution}派生或由 元素声明 请参阅 https://www.w3.org/TR/xmlschema11-1/#cvc-elt 第 4.3 条 我认为最后一点给出了线索:虽然类型声明覆盖了 blockDefault,但元素声明却没有。 将元素声明更改为 <xs:element name="base" type="Base" block=""/> 修复它。
我正在使用一些特定于域的 GML 文件,这些文件实际上是 XML 文件,能够存储 GIS 域中空间要素的几何形状。 我有这两个描述数据模型的 xsd 文件...
XSD 1.0 可空,带有 xs:string 类型枚举限制基数
我想确认我对 XSD nillable 属性的理解,因为它涉及强制枚举的限制基础。例如,给出以下内容: 我想确认我对 XSD nillable 属性的理解,因为它涉及强制枚举的限制基础。例如,给出以下内容: <xs:complexType name="_fruits"> <xs:sequence> <xs:element name="fruit" nillable="true" minOccurs="0" maxOccurs="unbounded"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="apple"/> <xs:enumeration value="banana"/> <xs:enumeration value="pear"/> <xs:enumeration value="orange"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:compexType> <xs:element name="fruits" type="_fruits"/> 以下模式验证失败: <fruits> <fruit>apple</fruit> <!-- ok --> <fruit>banana</fruit> <!-- ok --> <fruit xsi:nil="true"/> <!-- not ok --> </fruits> 允许空值的选项有哪些?我想到的是创建一个可为空的类型,然后使用联合 <xs:simpleType name="_nullableType"> <!-- the nullable type --> <xs:restriction base="xs:string"> <xs:maxLength value="0"/> </xs:restriction> </xs:simpleType> <xs:simpleType name= "_fruit"> <!-- the restriction base fruit --> <xs:restriction base="xs:string"> <xs:enumeration value="apple"/> <xs:enumeration value="banana"/> <xs:enumeration value="pear"/> <xs:enumeration value="orange"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="_nullableFruit"> <!-- a union of the restriction base and nullable --> <xs:union memberTypes="_fruit _nullableType"/> </xs:simpleType> <xs:element name="nullableFruit" type="_nullableFruit"/> <xs:complexType name="_fruits"> <!-- complex type --> <xs:sequence> <xs:element ref="nullableFruit" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:compexType> 然而,虽然上述达到了预期的效果,但非常复杂。任何其他选择将不胜感激。 您实际上声明了 xsi 命名空间吗? (如果您向我们展示了错误消息,那么我们就不需要询问...) 我的首选方法是将 fruit 声明为 minLength = 0、maxLength = 1 的列表类型。 我不喜欢使用xsi:nil,它看起来非常不必要的复杂。
转换 XML => JSON => 基于 XSD 架构的 XML
我看到了很多关于这个主题的帖子,但没有一个有答案。 实际上是否有一个 JAVA 库可以使用 XSD 架构进行 XML => JSON => XML 的转换,以更好地处理
我们正在使用 Crystal Report 来显示客户使用的报告。 他们可以通过我们使用 .rpt 文件的 C# 应用程序查看它们,该文件使用 .xsd 文件中的表。 我必须添加一些新的
我在 xml 架构方面遇到问题。 首先我想向您展示 xml 的可能情况: 1. 2012年1月1日 2. 2012年1月1日 ...
我希望所有 xjc 生成的类都实现可序列化接口。 阅读帖子中的解决方案后,我实现了它,但 jaxb2-maven-plugin 抛出以下错误: [错误] 文件:mapping.xsd [17,...
我正在使用 C# 和 .NET 8.0.6。 我有一个 XSD,它声明了一个带有 xs:token 内容的“根”元素。 当我使用具有填充内容的实例元素验证文档时,p...
如何使用 PowerShell 根据 XSD 验证 XML 文件?
作为我开发的一部分,我希望能够根据单个 XSD 文件验证整个文件夹的 XML 文件价值。 PowerShell 函数似乎是一个很好的候选者,因为我可以......
如何将 XML 模式 (XSD) 转换为 Relax NG?
Relax NG 主页列出了 Sun RELAX NG Converter,它显然能够将 XSD 文件转换为 Relaxng 文件 - 但链接已失效,并且有关二手来源的博客条目似乎是
我正在尝试为 Visual Studio 和 ModBuddy 创建一个 xsd 架构,以便更轻松、更用户友好地创建用于修改游戏《地球之外的文明》的 xml 文件。 我的问题是...
我有静态方法,我用它来根据 XSD 文件验证 XML 文件。这工作正常,直到存在包含另一个 XSD 文件的 XSD 文件。 例如,我遇到麻烦的地方: 类型.XSD:...
XSD:更改子 xsd 中的元素类型,其中类型是自定义创建的类型
我想更改从另一个 xsd 中的父 xsd 继承的元素的类型 这是“父”xsd 的一部分,其中包含类型 我想更改从另一个 xsd 中的父 xsd 继承的元素的类型 这是“父”xsd 的一部分,其中包含类型 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1"> <xs:simpleType name="Str30m1"> <xs:restriction base="xs:string"> <xs:maxLength value="30"/> <xs:minLength value="1"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="Str20"> <xs:restriction base="xs:string"> <xs:maxLength value="20"/> </xs:restriction> </xs:simpleType> <xs:complexType name="Data"> <xs:sequence> <xs:element name="LINE1" type="Str30m1" minOccurs="0"/> <xs:element name="LINE2" type="Str20" minOccurs="0"/> <xs:element name="LINE3" type="Str20" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:complexType name="Common_dataType"> <xs:element name="Details"> <xs:complexType> <xs:sequence> <xs:element name="Values" type="Data"/> </xs:sequence> </xs:complexType> </xs:element> </xs:complexType> </xs:schema> 我想将 LINE2 的类型更改为 Str30m1,但似乎无法使其工作。我认为这与这些都是本地的这一事实有关(在这种情况下这个词正确吗?)并且令人困惑 到目前为止,在“child”xsd 中我尝试过类似的操作 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1"> <xs:redefine schemaLocation="parent.xsd"> <xs:complexType name="Data"> <xs:complexContent> <xs:extension base="Data"> <xs:sequence> <xs:element name="LINE2" type="Str30m1" minOccurs="0"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:redefine> <xs:element name="Common_Data" type="Common_dataType"/> </xs:schema> 但是当我尝试验证这一点时,我收到错误 cos-element-consistent: Error for type 'Data'. Multiple elements with name 'LINE2', with different types, appear in the model group. 使用限制而不是扩展我得到 rcase-Recurse.2: There is not a complete functional mapping between the particles 我猜我在这里遗漏了一些东西或做错了一些事情,但我不确定,任何意见将不胜感激 xs:redefine机制不能用于对模式进行任意更改,例如将元素的类型更改为完全不相关的类型。即使可以使用它,它也存在严重问题,因为通常不清楚更改的具体范围是什么。 我建议编写一个 XSLT 转换来将此模式转换为不同的模式。
使用 XML 版本 1.1 对于游戏,我构建了一个名为“connected_condition”的复杂结构。它的代码看起来有点像这样: 使用 XML 版本 1.1 对于游戏,我构建了一个名为“connected_condition”的复杂结构。它的代码看起来有点像这样: <xs:complexType name="connected_condition" mixed="true"> <xs:sequence> <xs:choice minOccurs="0" maxOccurs="3"> <xs:element name="instruction" type="command" minOccurs="0" maxOccurs="2"/> <xs:element name="condition" type="extendedConditionFunction" minOccurs="0" maxOccurs="1"/> <xs:element name="annotation" type="defined_annotation" minOccurs="0" maxOccurs="2"/> </xs:choice> </xs:sequence> <xs:attribute name="annotation" type="annotation"/> <xs:attribute name="clothes" type="clothesType"/> <xs:attribute name="extended"> <xs:simpleType> <xs:union memberTypes="extendedParameter extendedFunction"/> </xs:simpleType> </xs:attribute> <xs:attribute name="value" type="valueString"/> <xs:attribute name="lasting" type="children" use='required'/> </xs:complexType> 此结构应该调用我的 xml xsd 文件中定义的几个可能属性的一个对象。第一个属性或元素应该是稍后要检查的条件(可以是任何预定义类型)。第二个元素及其属性始终被认为是当第一个属性或元素被满足时触发的结果。一个过于简单的例子如下所示: <connected_condition lasting ='false' annotation='stand'><annotation extended='roll_twice'/></connected_condition> 在这个例子中,当玩家处于站立状态时,他也应该掷两次骰子,而不是一次。属性lasting还定义了这是否是一次性使用,或者该效果是否将持续到被取消为止。 由于该结构应该检查并造成几种不同的效果,因此也可以使用类似的元素。所以像这样的结构也是有效的: <connected_condition lasting='false' annotation='stand'><annotation annotation='sit'/></connected_condition> 正如您可以想象的那样,这有可能两个元素实际上可能具有相同的属性,并且值也相同。所以可能有这样的结构:<annotation='stand'><annotation annotation='stand'/>。 为了防止这种情况,我在 xsd 文件中使用了一个断言,如下所示: <xs:assert test="not (. eq (annotation/@annotation))"/> 到目前为止,这一切都完美无缺。 然而,我的结构变得更加灵活,并且还应该调用给出新条件的函数(例如,为了在满足另一个条件时删除较早的状态或条件本身)。 这引出了我手头的问题。当我仅使用一次类似类型的子元素时,我的断言有效。但当我使用多个子元素时,它总是失败。我想要有效的结构看起来像这样: <connected_condition lasting='true' extended='sit'><annotation annotation='roll_twice'/><annotation annotation='changeMood'/><annotation annotation='delete'/></connected_condition> 在这里,玩家再次应该掷骰子两次,这次是坐着的。这种效果应该会持续到被取消为止。然而,一旦游戏情绪发生变化(可能由其他效果或条件触发),它就应该被删除。问题是,目前这些结构一旦具有多个相同类型的元素annotation,就会在默认情况下无法通过断言检查。 我如何编辑我的断言来检查,如果在具有相同类型的多个子元素的更复杂的条件结构中,这些元素的值永远不会相同,而不会在默认情况下失败? 我不确定我是否完全理解了您的要求,但是... 您通常可以通过唯一性约束来做到这一点。例如,在 connected_condition 的元素声明(不是类型声明)中使用 <xs:unique selector="annotation" field="@annotation"/>。 如果您不能这样做(例如,因为需要唯一的元素需要更复杂的谓词),那么您可以使用 test="count(annotation/@annotation) = count(distinct-values(annotation/@annotation))" 形式的断言。
根据 XML 文件的架构验证我的 XML 文件时收到此错误消息。谁能建议可能出了什么问题? XML 文件是: 根据 XML 文件的架构验证我的 XML 文件时收到此错误消息。谁能建议可能出了什么问题? XML 文件是: <?xml version="1.0"?> <family-tree xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ftree.xsd"> <person id="p5"> <name> <given>Al Frank</given> <surname>Smith</surname> </name> </person> <person id="p6"> <name> <given>Henry</given> <surname>Smith</surname> </name> <father ref="p5"/> </person> </family-tree> 架构是: <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xsd:element name="family-tree"> <xsd:complexType> <xsd:sequence> <xsd:element name="person" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="person"> <xsd:complexType> <xsd:sequence> <xsd:element name="name" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="father" minOccurs="0"/> </xsd:sequence> <xsd:attribute name="id" use="required" type="xsd:ID"/> </xsd:complexType> </xsd:element> <xsd:element name="name"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" name="given"/> <xsd:element minOccurs="0" name="surname"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="given" type="xsd:string"/> <xsd:element name="surname" type="xsd:string"/> <xsd:element name="father"> <xsd:complexType> <xsd:attribute name="ref" use="required" type="xsd:IDREF"/> </xsd:complexType> </xsd:element> </xsd:schema> 您使用哪个 XML 解析器?也许您的解析器不喜欢您的 id 未在文档中的任何位置引用这一事实。但是,我不记得读过这样的要求。也许在 XML 声明中添加standalone="no" () 会有所帮助?
我正在尝试根据以下架构对生成的属性进行简单的重命名: 我正在尝试从以下架构中对生成的属性进行简单的重命名: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://usermanagement" targetNamespace="http://usermanagement"> <!-- definitions of complexTypes RoleRef and OrganizationRef omitted --> <xs:element name="User"> <xs:complexType> <xs:complexContent> <xs:extension base="core:RawDTO"> <xs:sequence> <xs:element name="FirstName" type="xs:string"/> <xs:element name="LastName" type="xs:string" minOccurs="0"/> <xs:element name="UserId" type="xs:string" minOccurs="0"/> <xs:element name="Password" type="xs:string" minOccurs="0"/> <xs:element name="Active" type="xs:boolean" minOccurs="0"/> <xs:element name="Role" minOccurs="0" maxOccurs="unbounded" type="tns:RoleRef"/> <xs:element name="Organization" minOccurs="0" maxOccurs="unbounded" type="tns:OrganizationRef"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> </xs:schema> 使用此绑定: <bindings xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.1"> <bindings xmlns:tns="http://usermanagement" scd="x-schema::tns"> <!-- Testing simple element match: <bindings scd="tns:User"> <class name="Uzer"/> </bindings> --> <!-- other attempts: tns:User/type::0/model::sequence/tns:Role tns:User/type::0/tns:Role --> <bindings scd="tns:User/type::0/content::0/extension::0/model::sequence/tns:Role"> <property name="roles"/> </bindings> <schemaBindings> <package name="com.test.users"/> </schemaBindings> </bindings> </bindings> 问题是我无法让该表达式匹配,而且我发现的 SCD 示例非常少,并且与这种类型的结构与 element / complexType / complexContent / extension /equence 不匹配。 我尝试用作灵感的指南只有元素/复杂类型/序列:/schemaElement::my:chapter/type::0 据我所知,JAXB 使用的 XSOM 编译器不喜欢指南中的所有表达式类型,例如 /type::my:articleType/model::sequence/schemaElement::my:appendix 关于如何使用 SCD 进行匹配有任何线索吗? 谢谢你 我遇到了类似的问题,并且我也一直在阅读 W3 组件指示符规范。 由于 JAX2 Maven 插件中缺乏文档且详细输出有点损坏,我被迫使用格式不正确的 SCD 来运行它,以从插件/XJC 获取“帮助”: 匹配以下模式: 我能够使用以下 SCD 来匹配“类型”属性的枚举: /type::tns:CategoryType/attribute::Type/type::* 绑定配置如下所示: 希望有帮助。
这是我的示例 XML 代码: 我在用: 这是我的示例 XML 代码: <bestContact> <firstName><![CDATA[12345]]></firstName> <lastName /> </bestContact> 我正在使用: <xs:element name="lastName" type="xs:string" minOccurs="1" nillable="false"/> XSD 应验证 lastName 不为 null 或空。 尝试 <xs:element name="lastName" minOccurs="1" nillable="false"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="1"/> </xs:restriction> </xs:simpleType> </xs:element> <xsd:element name="lastName" type="NonEmptyString" nillable="false"/> <xsd:simpleType name="NonEmptyString"> <xsd:restriction base="xs:string"> <xsd:minLength value="1" /> <xsd:pattern value=".*[^\s].*" /> </xsd:restriction> </xsd:simpleType> 恕我直言,这是一个更好的模式: <xs:simpleType name="NonEmptyString"> <xs:restriction base="xs:string"> <xs:pattern value="^(?!\s*$).+" /> </xs:restriction> </xs:simpleType> 或 <xs:simpleType name="NonEmptyStringWithoutSpace"> <xs:restriction base="xs:string"> <xs:pattern value="\S+"/> </xs:restriction> </xs:simpleType> @Kamal 在这里给了你基本上正确的答案。这就是为什么 - nillable 似乎总是会引起问题。实际上,您可以将 nillable 视为含义 允许此元素上的 xsi:nil 属性。 XML Schema 规范 将 nillable 描述为带外信号 - 它基本上用于向数据库指示 NULL。 您想要的是一个元素,其长度必须至少为一个字符,如 @Kamal 给出的 这是我最喜欢的解决方案。 <xs:simpleType name="NonEmptyString"> <xs:restriction base="xs:string"> <xs:pattern value="[\s\S]*[^ ][\s\S]*"/> </xs:restriction> </xs:simpleType> 我的解决方案是使用 xs:token 因此忽略前导和尾随空格,并使用一个简单的正则表达式来验证是否存在至少一个非空白字符: <xs:simpleType name="NonEmptyElementType"> <xs:restriction base="xs:token"> <xs:minLength value="1"/> <xs:pattern value=".*\S.*"/> </xs:restriction> </xs:simpleType> <xs:minLength value="1"/>不是必需的,但我喜欢它对于未来维护者的可读性。