一般XSD检查XML是否格式正确?

时间:2016-01-19 09:26:10

标签: xml xsd xsd-validation

我们有一个导入XML文件的系统,根据xsd进行检查然后进行处理。

现在我们有一个案例,我们希望以这种方式传输任何对象。即Java对象被序列化为XML,稍后导入,根据xsd进行检查并进行处理。

由于我们事先不知道对象的确切外观,我们希望使用非常通用的xsd,并且只检查XML格式是否完好但不是特定节点左右。

我尝试找到这样一般的XSD,但我找到的只是网站会为你检查身体状况,而我需要一个类似检查的xsd。

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

“XML有一个标题和一个数据区。标题区域是结构化内容,我知道如何描述该部分。数据区域可以是任何东西。我不关心它是什么,我只是接受它,如果它是XML 。“

如果我找不到接受这种非特定内容的xsd,我会在这种情况下恢复跳过xsd验证,但这将是一个尴尬的解决方案,因为我必须改变一个完善的通用导入函数,我希望我不需要碰。

4 个答案:

答案 0 :(得分:2)

是的,您可以使用XSD验证程序检查格式良好或仅部分文档的有效性。

正如其他人所指出的那样,如果你真的想要只检查结构良好,那么根本不需要XSD验证步骤。

但它说这里说你不能使用XSD验证步骤来检查格式良好是错误的:你需要的只是一个基本上空洞的架构和一个你可以在“验证”中调用的验证器。 ; mode(它基本上验证了匹配声明的元素和属性 - 在一个空的模式中,没有找到)。因为任何普通的XSD验证器都会解析XML,如果你把它交给XML(而不是DOM对象),那么良好的格式就会被检查为副作用。 (当然,有可能争辩说,在这种情况下,格式良好的检查并不是 XSD验证过程的一部分,只是它的必要伴随。我是其中的一员。喜欢这种诡计的人;我不会觉得你关心这种区别。)

但实际上你说你知道如何描述(因此,我想,验证)标题区域,它只是应该不受约束的有效载荷区域。为此,您需要大致以下形式的架构。它的基本思想与asmith1024提供的草图非常相似,只是该模式对其objects元素使用显式通配符,而这个仅依赖于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"/>

答案 1 :(得分:1)

您可以尝试这样的事情:

  <?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包含在{http://test.any.org}个对象元素中,则它是有效的。

这将处理一个空列表:

<objects xmlns="http://test.any.org"/>

空列表:

<objects xmlns="http://test.any.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>

来自任何命名空间(或无)的异构对象列表:

<any:objects 
  xmlns:any="http://test.any.org"     
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <objectA type="someType" value="someValue"/>
  <objectB xmlns="http://some.external.schema" xsi:nil="true"/>
  <any2:objectC 
    xmlns:any2="http://another.external.schema"    
    xmlns:any3="http://some.funky.attribute">
    <any2:type any3:attr1="hello">Some Type</any2:type>
    <any2:value any3:attr2="whoops">Some Value</any2:value>
  </any2:objectC>
</any:objects>

当然,如果你收到一个没有对象元素作为其根目录的文档,你将不得不首先将它包含在一个文件中。

答案 2 :(得分:0)

不,你不能这样做。验证XML解析器需要将输入XML文档的根元素与模式中的元素声明进行匹配。如果无法做到这一点,那么vaildation当然会失败。

但是没有什么可以阻止你根据模式验证已知的内容,只检查&#34;良好的形成&#34;反对未知内容。

答案 3 :(得分:0)

*

XSD无法检查XML是 格式正确 。 XSD只能用于检查XML 有效 。任何XML解析器都将报告XML文档是否格式正确;不需要XSD。

有关格式良好和有效之间的区别,请参阅 Well-formed vs Valid XML

对于非常通用的XSD,请参阅 XML Schema that allows anything (xsd:any)

* ...unless you have a means of creating a vacuous XSD and invoking validation in lax mode