XSD通常是指以W3C XML Schema格式编写的文档,其中包含特定类型的XML文档的描述。
如何创建引用单独 jar 中存在的另一个 XSD 的 XSD - 依赖关系
我想创建一个 XSD,我们称之为 XSD_A,它位于模块:module_A 下。 我想通过包含或导入另一个 XSD 来引用,让我们从另一个模块调用该 XSD_B,modu...
XML 架构。 Base64binary 类型与 String 类型
我需要从某些 XML 元素中解码 Base64 字符串。 type="xs:base64binary" 定义的元素和 type="xs:string" 定义的元素有什么区别吗?一些 XSD 开发人员...
如何使用 Java 11 和具有导入功能的 XSD 来验证 XML 文件?
我有一个带有 Spring Boot 2.7 的 Java 11 应用程序。我需要使用 XSD 文件验证 XML 文件。这些 XSD 文件包含诸如 、a...
我在网上看到过一些关于为 logback.xml 文件提供 XML 模式或 DTD 以便在 ID 之类的 IDE 中至少具有非常基本的验证和自动完成功能会有多棒的讨论...
我正在尝试编写一个 XML 模式构造,该构造允许具有元素 A 或元素 B,或者同时具有 A 和 B。 我试过这个: 我正在尝试编写一个 XML 模式构造,该构造允许具有元素 A 或元素 B,或者同时具有 A 和 B。 我试过这个: <xs:complexType name="RoleMapType"> <xs:sequence> <xs:element minOccurs="0" name="Description" type="xs:string"/> <xs:element minOccurs="0" name="Schedule" type="xs:string"/> <xs:choice> <xs:element name="Loader" type="RoleMapLoaderType"/> <xs:element name="Dump" type="RoleMapDumpType"/> <xs:sequence> <xs:element name="Loader" type="RoleMapLoaderType"/> <xs:element name="Dump" type="RoleMapDumpType"/> </xs:sequence> </xs:choice> </xs:sequence> </xs:complexType> 但我收到一条错误消息,指出 Loader 和 Loader 不明确。 如何强制执行这样的约束? 我认为以下内容不被视为含糊不清: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="RoleMapType"> <xs:sequence> <xs:element minOccurs="0" name="Description" type="xs:string"/> <xs:element minOccurs="0" name="Schedule" type="xs:string"/> <xs:choice> <xs:sequence> <xs:element name="Loader" type="RoleMapLoaderType"/> <xs:element name="Dump" type="RoleMapDumpType" minOccurs="0"/> </xs:sequence> <xs:element name="Dump" type="RoleMapDumpType"/> </xs:choice> </xs:sequence> </xs:complexType> <xs:complexType name="RoleMapLoaderType"/> <xs:complexType name="RoleMapDumpType"/> </xs:schema>
当我们需要使用与另一个复杂类型几乎相似的值创建复杂类型时,使用complexContent还是创建复杂类型更好?
假设我有以下格式的复杂类型 假设我有以下格式的复杂类型 <xsd:complexType name="MyComplexType"> <xsd:sequence> <xsd:element name="FirstName" type="xsd:string"/> <xsd:element name="LastName" type="xsd:string"/> <xsd:element name="Age" type="xsd:int"/> <!-- Add more elements here as needed --> </xsd:sequence> </xsd:complexType> 现在如果想要另一种与MyComplexType具有相同内容的复杂类型,以下哪一个是最好的方法? 使用复杂内容 <xsd:complexType name="CustomComplexType"> <xsd:complexContent> <xsd:extension base="MyComplexType"> <xsd:sequence> <xsd:element name="FirstName" type="xsd:string"/> <xsd:element name="LastName" type="xsd:string"/> <!-- Add more elements here as needed, excluding Age --> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> 使用选择 <xsd:complexType name="MyComplexType"> <xsd:sequence> <xsd:choice> <xsd:element name="FirstName" type="xsd:string"/> <xsd:element name="LastName" type="xsd:string"/> <!-- Add more elements here as needed --> </xsd:choice> </xsd:sequence> </xsd:complexType> 完全创建新的复杂类型 <xsd:complexType name="MySimplifiedComplexType"> <xsd:sequence> <xsd:element name="FirstName" type="xsd:string"/> <xsd:element name="LastName" type="xsd:string"/> </xsd:sequence> </xsd:complexType> 为了方便且不影响现有模式,我采用了创建新的复杂类型的第三种方法。但想知道哪一种是最好的方法? 注意:无法针对我的案例编辑现有类型,因此也排除了第二个选项。但仍然希望包括在内,以便知道这是否是最好的方法。 如果从用例的角度来看,您的类型彼此不相关,您应该使用不同的类型来避免不相关实体之间的耦合。如果它们独立发散,稍后会节省您的精力。 如果它们相关,您可以利用扩展。将公共属性取出为一个基本类型,并从该基本类型扩展其他类型。 <xsd:complexType name="MyBaseComplexType"> <xsd:sequence> <!-- Common Elements --> <xsd:element name="FirstName" type="xsd:string"/> <xsd:element name="LastName" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="CustomComplexType"> <xsd:complexContent> <xsd:extension base="MyComplexType"> <xsd:sequence> <xsd:element name="Age" type="xsd:string"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="OtherCustomComplexType"> <xsd:complexContent> <xsd:extension base="MyComplexType"> <xsd:sequence> <xsd:element name="SomeOtherAttribute" type="xsd:string"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> CustomComplexType和OtherCustomComplexType现在将包含FirstName和LastName
我有 XML 和 XML 架构。 XML 包含过滤器,并且可以在另一个过滤器中包含过滤器。现在我尝试在架构中使用 key 和 keyref 但收到错误 The cardinality o...
NPM 中的任何 XML 库是否支持根据 XSD 架构验证 XML? 我会审视自己,但是: $ npm 搜索 xml 2>/dev/null |厕所-l 212 注意:xsd包不是它...
UBL文档中的customizationID要放什么以及从哪里获取这些信息
我正在尝试根据此 XSD 文件和此 schematron 生成发票 UBL XML 文件。一旦生成,我将在这里验证它。 所以,根据 schematron,我必须有一个 Customizat...
Excel 2016 可以在内部创建从 XML 数据文件导入的 XML 架构定义。它出现在 Excel 的“XML 源”面板中,列出了 XML 元素层次结构,其中可以...
如果UBL中的miniOccurs =“0”,如何知道哪个元素是必需的
这是我的 XML 测试代码: 这是我的 XML 测试代码: <?xml version="1.0" encoding="UTF-8"?> <Invoice xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2" xmlns:ccts="urn:oasis:names:specification:ubl:schema:xsd:CoreComponentParameters-2" xmlns:stat="urn:oasis:names:specification:ubl:schema:xsd:DocumentStatusCode-1.0" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:udt="urn:un:unece:uncefact:data:draft:UnqualifiedDataTypesSchemaModule:2" xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"> <cbc:ID>A00095678</cbc:ID> <cbc:IssueDate>2005-06-21</cbc:IssueDate> <cac:AccountingSupplierParty> </cac:AccountingSupplierParty> <cac:AccountingCustomerParty> </cac:AccountingCustomerParty> <cac:LegalMonetaryTotal> <cbc:PayableAmount currencyID="GBP">107.50</cbc:PayableAmount> </cac:LegalMonetaryTotal> <cac:InvoiceLine> <cbc:ID>A</cbc:ID> <cbc:LineExtensionAmount currencyID="GBP">100.00</cbc:LineExtensionAmount> <cac:Item> </cac:Item> </cac:InvoiceLine> </Invoice> 我将由于 minOccurs="1" 而需要的唯一元素放入 UBL.xsd 文件中。 当我尝试在此网站上验证我的 XML 时 [BR-01]-An Invoice shall have a Specification identifier (BT-24). [BR-04]-An Invoice shall have an Invoice type code (BT-3). [BR-05]-An Invoice shall have an Invoice currency code (BT-5). [BR-06]-An Invoice shall contain the Seller name (BT-27). [BR-07]-An Invoice shall contain the Buyer name (BT-44). [BR-08]-An Invoice shall contain the Seller postal address. [BR-10]-An Invoice shall contain the Buyer postal address (BG-8). [BR-CO-18]-An Invoice shall at least have one VAT breakdown group (BG-23). 我明白错误的含义,我的问题更多: UBL.xsd 文件说这些元素是强制性的是什么?我将必须生成有关其他 .xsd 文件的文件,并且我想了解哪些元素是必需的。 我认为这些错误来自 Schematron 验证,请参见例如https://github.com/ConnectingEurope/eInvoicing-EN16931/blob/validation-1.3.10/ubl/schematron/preprocessed/EN16931-UBL-validation-preprocessed.sch#L79.
参考此:其他帖子 我正在尝试做与另一篇文章中的OP基本相同的事情;使用我自己添加的属性扩展复杂类型,而不更改主命名空间。我
我从java 8迁移到java 17 在java 8中我使用这个插件从xsd生成xml: org.jvnet.jaxb2.maven2 ...
这是一个 XSD: 这是一个 XSD: <?xml version="1.0"?> <xsd:schema elementFormDefault='unqualified' attributeFormDefault='unqualified' xmlns:xsd='http://www.w3.org/2001/XMLSchema' > <xsd:simpleType name='TheSimpleType'> <xsd:restriction base='xsd:string' /> </xsd:simpleType> </xsd:schema> 这是第二个 XSD,其中包括上面的 XSD: <?xml version="1.0" encoding="UTF-8" ?> <xsd:schema elementFormDefault='unqualified' attributeFormDefault='unqualified' xmlns:xsd='http://www.w3.org/2001/XMLSchema' targetNamespace='a' xmlns='a' > <xsd:include schemaLocation='Include.xsd' /> <xsd:element name = "TheElement" > <xsd:complexType> <xsd:attribute name="Code" type="TheSimpleType" use="required"/> </xsd:complexType> </xsd:element> </xsd:schema> 我需要将(第二个)XSD 读入 C# 中并且: 检查它是否是有效的 XSD,并且 根据它验证文件。 这里有一些需要在架构中阅读的 C# 代码: XmlSchemaSet schemaSet = new XmlSchemaSet(); foreach (string sd in Schemas) { using (XmlReader r = XmlReader.Create(new FileStream(sd, FileMode.Open))) { schemaSet.Add(XmlSchema.Read(r, null)); } } schemaSet.CompilationSettings = new XmlSchemaCompilationSettings(); schemaSet.Compile(); .Compile() 失败,因为“类型 'a:TheSimpleType' 未声明,或者不是简单类型。” 但是,如果满足以下任一条件,它就会起作用: 名称空间已从架构中删除,或者 命名空间已添加到包含中。 问题是:如何让 C# 在不编辑架构的情况下接受它? 我怀疑问题在于,虽然我已将两个模式放入 XmlSchemaSet 中,但我仍然需要告诉 C# 其中一个模式包含在另一个模式中,即它本身尚未解决。事实上,如果我只告诉 XmlSchemaSet 有关主 XSD(而不是包含)(没有(或有)命名空间),那么“类型 'TheSimpleType' 未声明,或者不是简单类型。” 因此,这似乎是一个关于解决的问题,包括:如何?! 问题在于打开架构以供在线阅读的方式: XmlReader.Create(new FileStream(sd, FileMode.Open) 我必须编写自己的XmlResolver,然后才能看到包含文件的路径是如何解析的:它来自可执行文件的目录,而不是来自父模式的目录。问题在于父架构未获取其 BaseURI 集。以下是打开架构的方法: XmlReader.Create(new FileStream(pathname, FileMode.Open, FileAccess.Read),null, pathname) 您可以使用 XmlSchema.Includes 将它们链接在一起。然后,您只需将主模式添加到模式集中即可: var includeSchema = XmlSchema.Read(XmlReader.Create(...), null); var mainSchema = XmlSchema.Read(XmlReader.Create(...), null); var include = new XmlSchemaInclude(); include.Schema = includeSchema; mainSchema.Includes.Add(include); var schemaSet = new XmlSchemaSet(); schemaSet.Add(mainSchema); schemaSet.Compile(); XmlSchemaSet 的默认行为是不尝试解析任何 XSD 包含的架构。为此,必须初始化 XmlResolver 属性。 XmlSchemaSet schemas = new XmlSchemaSet { XmlResolver = new XmlUrlResolver() }; 此外,您必须按照 @Richard Barraclough 的回答为 XmlReader 设置 baseUri。 试试这个:D public static XmlSchema LoadSchema(string pathname) { XmlSchema s = null; XmlValidationHandler h = new XmlValidationHandler(); using (XmlReader r = XmlReader.Create(new FileStream(pathname, FileMode.Open))) { s = XmlSchema.Read(r, new ValidationEventHandler(h.HandleValidationEvent)); } if (h.Errors.Count > 0) { throw new Exception(string.Format("There were {1} errors reading the XSD at {0}. The first is: {2}.", pathname, h.Errors.Count, h.Errors[0])); } return s; } public static XmlSchema LoadSchemaAndResolveIncludes(string pathname) { FileInfo f = new FileInfo(pathname); XmlSchema s = LoadSchema(f.FullName); foreach(XmlSchemaInclude i in s.Includes) { XmlSchema si = LoadSchema(f.Directory.FullName + @"\" + i.SchemaLocation); si.TargetNamespace = s.TargetNamespace; i.Schema = si; } return s; } public static List<ValidationEventArgs> Validate(string pathnameDocument, string pathnameSchema) { XmlSchema s = LoadSchemaAndResolveIncludes(pathnameSchema); XmlValidationHandler h = new XmlValidationHandler(); XmlDocument x = new XmlDocument(); x.Load(pathnameDocument); x.Schemas.Add(s); s.Compile(new ValidationEventHandler(h.HandleValidationEvent)); x.Validate(new ValidationEventHandler(h.HandleValidationEvent)); return h.Errors; } 特别注意si.TargetNamespace = s.TargetNamespace;。 显然,这假设包含被指定为相对于它们所包含到的模式的文件路径。 这是我编写的用于处理 xsd 验证的方法。希望这对某人有所帮助。 /// <summary> /// Ensure all xsd imported xsd documented are in same folder as master xsd /// </summary> public XsdXmlValidatorResult Validate(string xmlPath, string xsdPath, string xsdNameSpace) { var result = new XsdXmlValidatorResult(); var readerSettings = new XmlReaderSettings {ValidationType = ValidationType.Schema}; readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; readerSettings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; readerSettings.Schemas.Add(null, xsdPath); readerSettings.ValidationEventHandler += (sender, args) => { switch (args.Severity) { case XmlSeverityType.Warning: result.Warnings.Add(args.Message); break; case XmlSeverityType.Error: result.IsValid = false; result.Warnings.Add(args.Message); break; } }; var reader = XmlReader.Create(xmlPath, readerSettings); while (reader.Read()) { } return result; } 使用.net6,代码如下 - XmlReaderSettings settings = new XmlReaderSettings(); settings.Schemas.XmlResolver = new XmlUrlResolver(); // Need this for resolving include and import settings.ValidationType = ValidationType.Schema; // This might not be needed, I am using same settings to validate the input xml settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; settings.Schemas.Add(null, "yourpath\\yourxsd.xsd"); settings.Schemas.Compile(); string xmlFilePath = "yourpath\\your.xml"; ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler); // Create an XmlReader for the XML file using (XmlReader reader = XmlReader.Create(xmlFilePath, settings)) { } 想要强调的是,对于 net6,我们必须设置 settings.Schemas.XmlResolver = new XmlUrlResolver() 而不是 settings.XmlResolver = new XmlUrlResolver()
How to add custom String to List<String> jaxb xml adapter to an xsd generated class attribute
我们长期以来一直在使用 jaxb 将 XML 解组为我们可以在我们的系统中使用的 POJO。但是,直到最近我才发现 jaxb 如何解析 xml 提供的数据的问题,我...
使用 XJC 编译器使用 XSD 文件时如何删除生成的类文件的根元素中的命名空间
如何使用xjc 插件编译生成的XSD 文件的类文件的根元素中删除名称空间。我正在使用 JDK17 和 Jakarta。我只想将名称空间保留给子元素...
我正在尝试针对 XSD 验证 XML。 XML 在根元素中包含命名空间声明: xmlns="http://www.sample.com/itemfile" 目前,当我正在验证时,我...