XSD验证用于根据存储的架构验证XML文件。
NiFi中的ValidateXml处理器支持XSD版本1.1吗?
NiFi中的ValidateXml处理器支持XSD版本1.1吗?
我是 XSD 架构验证的新手。我正在寻找适用于 XSD 架构的 if else 条件。在互联网上进行了大量搜索后,我发现了“assert”元素,我们可以在其中测试条件
这是我的 XML 这是我的 XML <?xml version="1.0" encoding="utf-8"?> <Zones xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.keaneaustralia.com/Nts" xsi:schemaLocation="http://schemas.keaneaustralia.com/Nts Zones.xsd" version="1" major_version="434" minor_version="0" start_date="2023-07-09T00:00:00+10:00"> <Record long_desc="City Saver Zone"/> <Record logical="2" physical="1" short_desc="Zone 1" long_desc="Zone 1" is_city_saver="Yes" /> <Record logical="3" physical="2" short_desc="Zone 2" long_desc="Zone 2" is_city_saver="false" /> <Record logical="dt" physical="3" short_desc="Zone 3" long_desc="Zone 3" is_city_saver="false" /> <Record logical="5" physical="4" short_desc="Zone 4" long_desc="Zone 4" is_city_saver="false" /> <Record logical="6" physical="5" short_desc="Zone 5" long_desc="Zone 5" is_city_saver="false" /> </Zones> 这是我的XSD <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:tns="http://schemas.keaneaustralia.com/Nts" elementFormDefault="qualified" targetNamespace="http://schemas.keaneaustralia.com/Nts" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Zones" nillable="true" type="tns:ZoneCollection" /> <xs:complexType name="ZoneCollection"> <xs:complexContent mixed="false"> <xs:extension base="tns:DataElementOfZone" /> </xs:complexContent> </xs:complexType> <xs:complexType name="DataElementOfZone"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="Record" type="tns:Zone" /> </xs:sequence> <xs:attribute name="version" type="xs:int" use="required" /> <xs:attribute name="major_version" type="xs:int" use="required" /> <xs:attribute name="minor_version" type="xs:int" use="required" /> <xs:attribute name="start_date" type="xs:dateTime" use="required" /> <xs:attribute default="false" name="is_delta" type="xs:boolean" /> <xs:attribute default="0" name="delta_major_version" type="xs:int" /> <xs:attribute default="0" name="delta_minor_version" type="xs:int" /> </xs:complexType> <xs:complexType name="Zone"> <xs:attribute name="logical" type="xs:unsignedByte" use="required" /> <xs:attribute name="physical" type="xs:unsignedByte" use="required" /> <xs:attribute name="short_desc" type="xs:string" /> <xs:attribute name="long_desc" type="xs:string" /> <xs:attribute name="is_city_saver" type="xs:boolean" use="required" /> </xs:complexType> </xs:schema> 该文件正在通过验证,并且不会引发任何错误。当我检查调试模式时,attributeSchemaInfo 出现空引用异常。下面是验证 xml 的函数。它不会引发逻辑属性所需的异常和字段 is_city_saver 的类型错误,该字段只需要布尔值:true 和 false,而不是 yes 和 no。 private static bool ValidateXmlAgainstXsd(string xmlFilePath, string xsdFilePath, ILogger fileLogger) { try { int numErreur = 0; XmlSchemaSet schemaSet = new XmlSchemaSet(); schemaSet.Add(null, xsdFilePath); schemaSet.Compile(); XmlReaderSettings settings = new XmlReaderSettings(); settings.Schemas.Add(schemaSet); settings.ValidationType = ValidationType.Schema; settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings | XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ProcessInlineSchema; settings.ValidationEventHandler += (sender, e) => { LogValidationError(xmlFilePath, e.Message, e.Exception, e.Exception.LineNumber, e.Exception.LinePosition, e.Severity, fileLogger, ref numErreur); }; using (XmlReader reader = XmlReader.Create(xmlFilePath, settings)) { while (reader.Read()) { //process code } } return numErreur > 0 ? false : true; } catch (Exception ex) { Console.WriteLine($"Error validating XML '{xmlFilePath}' against XSD '{xsdFilePath}': {ex.Message}"); return false; } } 我稍微修改了您的代码,并注释掉/删除了 LogValidationError() 调用。 XSD 验证正在运行!请看下面。 我的猜测是问题正是与注释掉的LogValidationError()有关。 c# void Main() { string xmlFilePath = @"e:\Temp\Zones.xml"; string xsdFilePath = @"e:\Temp\Zones.xsd"; ValidateXmlAgainstXsd(xmlFilePath, xsdFilePath); } private static bool ValidateXmlAgainstXsd(string xmlFilePath, string xsdFilePath) { try { int numErreur = 0; XmlSchemaSet schemaSet = new XmlSchemaSet(); schemaSet.Add(null, xsdFilePath); schemaSet.Compile(); XmlReaderSettings settings = new XmlReaderSettings(); settings.Schemas.Add(schemaSet); settings.ValidationType = ValidationType.Schema; settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings | XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ProcessInlineSchema; settings.ValidationEventHandler += (sender, e) => { //LogValidationError(xmlFilePath, e.Message, e.Exception, e.Exception.LineNumber, e.Exception.LinePosition, e.Severity, fileLogger, ref numErreur); Console.WriteLine(e.Message); }; using (XmlReader reader = XmlReader.Create(xmlFilePath, settings)) { while (reader.Read()) { //process code } } return numErreur > 0 ? false : true; } catch (Exception ex) { Console.WriteLine($"Error validating XML '{xmlFilePath}' against XSD '{xsdFilePath}': {ex.Message}"); return false; } } 输出 The required attribute 'logical' is missing. The required attribute 'physical' is missing. The required attribute 'is_city_saver' is missing. The 'is_city_saver' attribute is invalid - The value 'Yes' is invalid according to its datatype 'http://www.w3.org/2001/XMLSchema:boolean' - The string 'Yes' is not a valid Boolean value. The 'logical' attribute is invalid - The value 'dt' is invalid according to its datatype 'http://www.w3.org/2001/XMLSchema:unsignedByte' - The string 'dt' is not a valid Byte value.
complexType设置abstract=“true”的XSD问题
在XSD文件中定义如下: 在 XSD 文件中定义如下: <xs:element name="AdditionalData" type="AddData" minOccurs="0"> <xs:alternative test="@Type = 'Woodham'" type="AddDataWoodham"/> </xs:element> <xs:complexType name="AddData" abstract="true"/> <xs:complexType name="AddDataWoodham"> <xs:complexContent> <xs:extension base="AddData"> <xs:all> <xs:element name="FilePath" type="xs:string" minOccurs="1" /> <xs:element name="ScaleFactorP" type="xs:decimal" minOccurs="1" /> <xs:element name="ScaleFactorQ" type="xs:decimal" minOccurs="1" /> <xs:element name="CalculationMethod" type="xs:integer" minOccurs="1" /> <xs:element name="SlantLookupSize" type="xs:integer" minOccurs="1" /> <xs:element name="TiltLookupSize" type="xs:integer" minOccurs="1" /> </xs:all> </xs:extension > </xs:complexContent> </xs:complexType> 我是 XML 文件: <AdditionalData> <FilePath>files\matrix.xml</FilePath> <ScaleFactorP>1.5</ScaleFactorP> <ScaleFactorQ>1.5</ScaleFactorQ> <CalculationMethod>2</CalculationMethod> <SlantLookupSize>25</SlantLookupSize> <TiltLookupSize>72</TiltLookupSize> </AdditionalData> 但我收到一个错误: 我不知道问题出在哪里,有人可以帮我解决这个错误吗?谢谢! 我尝试做抽象=“假”,这不起作用,因为基本元素是空的...... 我不确定你想在这里实现什么目标。 您的类型替代规则是说,如果 @Type 是“Woodham”,那么该元素应该具有类型 AddDataWoodham;如果 Type 属性不存在或具有任何其他值(您的示例就是这种情况),则该元素应具有类型 AddData;但元素不能具有类型 AddData,因为该类型是抽象的。所以这显然是一个错误。 您的实例似乎符合类型 AddDataWoodham,但未针对该类型进行验证,因为它没有值为 Type 的 Woodham 属性。
最终,我想知道是否可以根据此处字符串变量(而不是已经存在的 .xsd 文件)中包含的架构来验证 Xml 文件。 我找到了几个例子...
我是 XML XSD 验证的新手。我正在尝试验证 XML 中的县作为枚举列表以及每个国家/地区的州。 我有这个简单的 XML: 我是 XML XSD 验证的新手。我正在尝试验证 XML 中的县作为枚举列表以及每个国家/地区的州。 我有这个简单的 XML: <?xml version="1.0" encoding="UTF-8"?> <mylist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd"> <myrow> <country>Country 1</country> <state>State 11</state> </myrow> <myrow> <country>Country 2</country> <state>State 22</state> </myrow> <myrow> <country>Country 3</country> <state>State 33</state> </myrow> </mylist> 我正在尝试验证 XSD 中所示的国家和每个国家/地区的州... <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> <xs:element name="mylist"> <xs:complexType> <xs:sequence> <xs:element name="myrow" maxOccurs="unbounded" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="country" type="country_type" /> <xs:element name="state" > <xs:alternative test="$country eq 'Country 1'" type="country_1_states_type"/> <xs:alternative test="$country eq 'Country 2'" type="country_2_states_type"/> <xs:alternative test="$country eq 'Country 3'" type="country_3_states_type"/> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <!-- LookUp Lists --> <xs:simpleType name="country_type"> <xs:restriction base="xs:string"> <xs:enumeration value="Country 1"/> <xs:enumeration value="Country 2"/> <xs:enumeration value="Country 3"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="country_1_states_type"> <xs:restriction base="xs:string"> <xs:enumeration value="State 11"/> <xs:enumeration value="State 12"/> <xs:enumeration value="State 13"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="country_2_states_type"> <xs:restriction base="xs:string"> <xs:enumeration value="State 21"/> <xs:enumeration value="State 22"/> <xs:enumeration value="State 23"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="country_3_states_type"> <xs:restriction base="xs:string"> <xs:enumeration value="State 31"/> <xs:enumeration value="State 32"/> <xs:enumeration value="State 33"/> </xs:restriction> </xs:simpleType> </xs:schema> 验证器抛出了这个错误: A Problem Was Found Starting At: Alternative. 有人可以帮忙吗? 我认为该错误消息可能意味着您的 XSD 处理器仅支持 XSD 1.0 而不是 XSD 1.1(这是 xs:alternative 所必需的)。 但是,您的架构无论如何都无法工作。 xs:alternative 只能访问元素的属性,而不能访问子元素(也不能访问带有 $ 符号的变量,这看起来就像您在进行随机猜测)。 这更多的是 XSD 1.1 断言的用例: test="(Country='A' and State='B') or (Country='X' and State='Y') or ..."
有没有办法在使用MathMl 2.0的同时在XSD中关联MathMl 3.0版本?
我是一名软件工程师,目前正在开发一个项目,该项目将根据我拥有的 xsd 验证带有 MathML 标记的 xml 文件的有效性。 MathML 2.0 版本包含在该 x...
如何使用 Java 11 和具有导入功能的 XSD 来验证 XML 文件?
我有一个带有 Spring Boot 2.7 的 Java 11 应用程序。我需要使用 XSD 文件验证 XML 文件。这些 XSD 文件包含诸如 、a...
我正在尝试针对 XSD 验证 XML。 XML 在根元素中包含命名空间声明: xmlns="http://www.sample.com/itemfile" 目前,当我正在验证时,我...
如何使用 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 相同的文件夹中。 如何链接这两个文件? How to link an XSD to an XML document depends on the XML document is using namespaces or not... 没有命名空间 使用 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> With 命名空间 使用 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> XSD <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/ns"> <xsd:element name="root"> <!-- ... --> </xsd:element> </xsd:schema>
Powershell 中的 XML 解析器并在验证后移动文件
以下脚本已经运行良好。我可以根据 xsd 文件验证给定的 xml 文件并记录所有验证错误。 我的问题是,如果没有验证错误,我想移动 xml 文件
How to Create XML from XSD where Schema is in multiple XSD
我需要从 XSD 文件创建 XML 文件。但它的架构存在于多个 XSD 中。我已经尝试使用 ECLIPSE IDE 进行 tp 创建。请帮我摆脱这个.. 为 CREATEE_ABC_REQ 两个生成 XML ...
在 Powershell 中解析 XML 并获取所有 xsd 验证错误
我的目标是在 powershell 5.1 中针对 xsd 架构文件验证 xml。到目前为止,我得到了以下代码。实际上它有效并告诉我错误。但问题是,只有第一个验证...
XML 未针对定义了密钥和 keyref 的 XSD 进行验证
获取 XML 文件以针对 XSD 进行验证时遇到问题。 我正在使用 Visual Studio 2022 编辑和测试 XML 和 XSD。 尝试验证工作负载中的包是
我想做一个枚举元素,它应该包含世界上所有可能的地区(本地,全国,国际)(或者作为一个开始,加拿大应该是好的),我一直在寻找一种方法来 ...
我想建立一个新的模式来验证XML,以适应我的工作。但我很难回答这个问题:我能否也如何创建一个复杂的元素,其中有一些元素需要 ...
XSD 错误:cvc-complex-type.2.4.a: 发现以元素开头的内容无效
我有一个XML文件,需要与XSD文件一起验证。但当我想用XSD文件Cvc-complex-type.2.4.a来验证我的XML时,我得到了这个错误。Invalid Content Was Found Starting With ....
XSD 错误:cvc-complex-type.2.4.a: 发现以元素开头的内容无效
我有一个XML文件,需要用XSD文件来验证,但是当我想用XSD文件Cvc-complex-type.2.4.a来验证我的XML时,我得到了这个错误。Invalid Content Was Found Starting With ...
我正在寻找一个解决方案,在XML 1.0的约束条件下,在XSD模式中指定一个表应该被完全填满或根本不填。该表是可选的,只有当...