检查XML格式是否正确的通用XSD?

检查XML格式是否正确的通用XSD?,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,我们有一个导入XML文件、对照xsd检查然后处理的系统 现在我们有一个例子,我们想用这种方式转移任何物体。也就是说,一个Java对象被序列化为XML,然后导入,对照xsd检查并处理 由于我们事先不知道对象的确切外观,我们希望使用一个非常通用的xsd,只检查XML格式是否正确,而不检查特定节点等 我试着找到这样一个通用的XSD,但我找到的只是那些可以为您检查良好格式的网站,而我需要一个做类似检查的XSD 有人知道这样的XSD吗?或者我如何创建它。理想情况下,它会说: “XML有一个标题和一个数据区

我们有一个导入XML文件、对照xsd检查然后处理的系统

现在我们有一个例子,我们想用这种方式转移任何物体。也就是说,一个Java对象被序列化为XML,然后导入,对照xsd检查并处理

由于我们事先不知道对象的确切外观,我们希望使用一个非常通用的xsd,只检查XML格式是否正确,而不检查特定节点等

我试着找到这样一个通用的XSD,但我找到的只是那些可以为您检查良好格式的网站,而我需要一个做类似检查的XSD

有人知道这样的XSD吗?或者我如何创建它。理想情况下,它会说:

“XML有一个标题和一个数据区。标题区是结构化内容,我知道如何描述该部分。数据区可以是任何内容。我不在乎它是什么,只要它是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"/>