检查XML格式是否正确的通用XSD?
我们有一个导入XML文件、对照xsd检查然后处理的系统 现在我们有一个例子,我们想用这种方式转移任何物体。也就是说,一个Java对象被序列化为XML,然后导入,对照xsd检查并处理 由于我们事先不知道对象的确切外观,我们希望使用一个非常通用的xsd,只检查XML格式是否正确,而不检查特定节点等 我试着找到这样一个通用的XSD,但我找到的只是那些可以为您检查良好格式的网站,而我需要一个做类似检查的XSD 有人知道这样的XSD吗?或者我如何创建它。理想情况下,它会说: “XML有一个标题和一个数据区。标题区是结构化内容,我知道如何描述该部分。数据区可以是任何内容。我不在乎它是什么,只要它是XML,我就接受它。”检查XML格式是否正确的通用XSD?,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,我们有一个导入XML文件、对照xsd检查然后处理的系统 现在我们有一个例子,我们想用这种方式转移任何物体。也就是说,一个Java对象被序列化为XML,然后导入,对照xsd检查并处理 由于我们事先不知道对象的确切外观,我们希望使用一个非常通用的xsd,只检查XML格式是否正确,而不检查特定节点等 我试着找到这样一个通用的XSD,但我找到的只是那些可以为您检查良好格式的网站,而我需要一个做类似检查的XSD 有人知道这样的XSD吗?或者我如何创建它。理想情况下,它会说: “XML有一个标题和一个数据区
如果我找不到一个可以接受这种非特定内容的xsd,那么在这种情况下,我将返回跳过xsd验证,但这将是一个尴尬的解决方案,因为我必须更改一个完善的通用导入函数,我希望我不需要碰它。不,您不能这样做。验证XML解析器需要将输入XML文档的根元素与模式中的元素声明相匹配。如果做不到这一点,当然会失败
但是,没有什么可以阻止您根据模式验证已知内容,只检查未知内容的“格式良好性”。您可以尝试以下方法:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://test.any.org"
xmlns="http://test.any.org"
elementFormDefault="qualified">
<xs:element name="objects">
<xs:complexType nillable="true">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
您要说的是,任何格式良好的XML都是有效的,如果它包含在{}objects元素中
这将处理空列表:
<objects xmlns="http://test.any.org"/>
空列表:
<objects xmlns="http://test.any.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
以及来自任何命名空间(或无命名空间)的异构对象列表:
某种类型
一些价值
当然,如果您收到的文档根元素不是objects元素,那么您必须首先将其包含在一个元素中。否*
XSD无法检查XML是否格式良好。XSD只能用于检查XML是否有效。任何XML解析器都将报告XML文档是否格式良好;这不需要XSD
有关格式正确和有效的区别,请参见
有关非常通用的XSD,请参见
* 是的,您可以使用XSD验证器检查格式是否正确,或者只检查文档一部分的有效性。 正如其他人所指出的,如果您真的只想检查格式是否良好,那么根本不需要XSD验证步骤 但是这里他们说不能使用XSD验证步骤来检查格式是否良好是错误的:您所需要的只是一个基本上是空的模式和一个可以在“lax验证”模式下调用的验证器(它基本上根据匹配的声明验证元素和属性——在空的模式中,找不到任何元素和属性)。由于任何普通的XSD验证器都将解析XML,如果您将其交给XML(而不是DOM对象),那么良好的格式将作为副作用进行检查。(当然,有可能争辩说,在这种情况下,良好格式检查实际上不是XSD验证过程的一部分,只是一个必要的伴随。我是喜欢这种随意性的人之一;我没有感觉到你关心这种区别。) 但事实上,您说您知道如何描述(因此,我认为,验证)头部区域,而应该不受约束的只是有效负载区域。为此,您需要一个大致如下形式的模式。它的基本思想与asmith1024提供的草图非常相似,只是该模式对其
对象
元素使用了显式通配符,而该模式仅依赖于默认类型xs:anyType;一个结果是,这个元素的tns:payload
元素将接受字符数据作为内容,而objects
元素则不会
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://example.com/nss/target"
xmlns:tns="http://example.com/nss/target">
<!--* a message contains a header and
* a payload. *-->
<xs:complexType name="message">
<xs:sequence>
<xs:element ref="tns:header"/>
<xs:element ref="tns:payload"/>
</xs:sequence>
</xs:complexType>
<xs:element name="message" type="tns:message"/>
<!--* a header has a defined structure
* (to be specified ...) *-->
<xs:element name="header">
<!--* ... your definition of header
* validity here ... *-->
</xs:element>
<!--* other types and elements used in
* header ... *-->
<!--* A payload has NO defined structure. *-->
<!--* no definition of any type for payload,
* so it defaults to xs:anyType, and
* can contain ... any well-formed XML
* content. *-->
<xs:element name="payload"/>
此帐户的问题在于它假定模式验证有一个二进制结果;没有。需要匹配的元素声明或类型才能使结果有效,但架构中声明不匹配的文档不一定无效。可以设置验证过程,使其在无效输入时失败,然后继续进行有效输入或有效性=未知的输入。您确定否?我同意你的观点,即良好形式检查不需要XSD。但这是否意味着它不能被使用,尽管不必要?格式良好是一致性XML解析器生成信息集的先决条件,那么,为什么不使用一个空模式调用XSD验证来执行格式良好检查呢?特别是考虑到一个需要XSD验证步骤的现有系统,即使对于未知内容的文档也是如此?在我阅读了下面的文章之前,我一直认为我是肯定的::-)感谢您花时间解释这一点。我已经限定了我的“否”,但我的答案保持不变,因为我认为它仍然保留了一点作为真理一级近似值的价值。编辑得很好!我认为,增加脚注中的限定条件很好地解决了这些问题。我很高兴你把答案留在这里。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://example.com/nss/target"
xmlns:tns="http://example.com/nss/target">
<!--* a message contains a header and
* a payload. *-->
<xs:complexType name="message">
<xs:sequence>
<xs:element ref="tns:header"/>
<xs:element ref="tns:payload"/>
</xs:sequence>
</xs:complexType>
<xs:element name="message" type="tns:message"/>
<!--* a header has a defined structure
* (to be specified ...) *-->
<xs:element name="header">
<!--* ... your definition of header
* validity here ... *-->
</xs:element>
<!--* other types and elements used in
* header ... *-->
<!--* A payload has NO defined structure. *-->
<!--* no definition of any type for payload,
* so it defaults to xs:anyType, and
* can contain ... any well-formed XML
* content. *-->
<xs:element name="payload"/>