XSD通常是指以W3C XML Schema格式编写的文档,其中包含特定类型的XML文档的描述。
我正在尝试在 XSD 中创建一个内部元素来呈现不同类型的 XML 所以预期的 XML 结构将是这样的: 我正在尝试在 XSD 中创建一个内部元素来呈现不同类型的 XML 所以预期的 XML 结构将是这样的: <root> <something> <specificName> <?xml version="1.0" encoding="UTF-8" standalone="yes"?> etc </specificName> </something> </root> 当我使用xs:any时,生成的Java类包含这个 我希望元素的 name 是 specified,但可以是任何类型。 问题是我尝试在“any”元素中设置的每个元素都是附加,而不是设置,创建此 XML 结构: <root> <something> <any> <?xml version="1.0" encoding="UTF-8" standalone="yes"?> etc </any> </something> </root> 我想要其中一个: 让 JaxB 以某种方式知道(通过绑定?)元素名称将设置为“specifiedName” 在反序列化过程中忽略“任何”元素 PS:我知道 xs:anyType 解决了这个问题,但我想特别表明,我将在宽松的进程上下文中为该元素使用任何命名空间 基本上你自己回答了。您需要一个包含 any: 的元素 public class SpecificName { @XmlAnyElement(lax = true) private Object any; ... } public class Something { @XmlElement private SpecificName specificName; ... } 请注意,如您的示例所示,拥有第二个 XML 声明是行不通的。
我从 AJAX 调用中获取自定义架构数据,我需要使用 jQuery 解析它。知道如何做到这一点吗? 这是 XML: 我从 AJAX 调用中获取自定义架构数据,并且需要使用 jQuery 对其进行解析。知道如何做到这一点吗? 这是 XML: <xsd:get_customer_summary_response xmlns:xsd="http://com/acmeco/ovm/cas/xsd"> <xsd:customer_details> <typ:phone_number xmlns:typ="http://com/acmeco/ovm/cas/types">1.555.5553002</typ:phone_number> <typ:timezone xsi:nil="true" xmlns:typ="http://com/acmeco/ovm/cas/types" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> <typ:zipcode xmlns:typ="http://com/acmeco/ovm/cas/types">3002</typ:zipcode> ... </xsd:customer_details> </xsd:get_customer_summary_response> 这是 AJAX 调用。我可以使用下面的内容解析普通的 XML,但不能解析 XSD 的内容。 $.ajax({ type: "GET", url: "so.xml", dataType: "html", success: function(returnhtml){ $("customer_details", returnhtml).find("zipcode").each(function() { alert($(this).text()); }); }, etc. 有什么想法吗? 我还没有测试过,但你尝试过吗: $.ajax({ type: "GET", url: "so.xml", dataType: "html", success: function(returnhtml){ $(returnhtml).find("customer_details zipcode").each(function() { alert($(this).text()); }); }, etc. jQuery 的 context 参数需要一个 DOM 元素。 如果将 returnhtml 设置为 HTML,jQuery's ajax() documentation 将根据 dataType 成为 HTML 字符串。如果它是 XML 字符串,则需要先让 jQuery 将其转换为可以使用的元素,然后再将其用作上下文。 您可以使用 $.parseXML 来实现。 success: function (returnhtml) { var parsedXML = $.parseXML(returnhtml); $(parsedXML).find("zipcode").each(function() { alert($(this).text()); }); } https://jsfiddle.net/chukanov/jjt894dc/
有没有办法在使用MathMl 2.0的同时在XSD中关联MathMl 3.0版本?
我是一名软件工程师,目前正在开发一个项目,该项目将根据我拥有的 xsd 验证带有 MathML 标记的 xml 文件的有效性。 MathML 2.0 版本包含在该 x...
如何创建引用单独 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()