如何制作有效的内联XML模式?

Dar*_*ryn 6 xml xsd xml-validation

我需要编写一个嵌入式XML模式,即该模式是在与数据相同的XML中定义的。

我试图了解如何正确执行此操作,但到目前为止,我还没有获得通过验证的简单示例。这是我尝试用作带有内联架构的简单示例XML的内容:(
注意:XML结构(例如,根/项目)已经大肆使用,因此我被约束为无法在数据元素上使用名称空间)

<?xml version="1.0"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="#mySchema">
  <xs:schema id="mySchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="item" type="xs:string"
                      maxOccurs="unbounded" minOccurs="0"/>
        </xs:sequence>
      </xs:complexType>
   </xs:element>
 </xs:schema>
 <item>String 1</item>
 <item>String 2</item>
 <item>String 3</item>
</root>
Run Code Online (Sandbox Code Playgroud)

但是,当我通过w3.org XML Schema Validator运行该XML时,该XML验证失败,并显示以下错误消息,它不希望将其<xs:schema>视为子元素!

每个cvc-complex-type.1.2.4无效: 元素{ http://www.w3.org/2001/XMLSchema }:此处不允许元素{None}:root中的模式(1),期望[{None}:项目,$]:

问:能否给我展示一个简单的XML文档的示例,该示例具有通过验证的内联模式定义?

Mic*_*Kay 5

如果您的root孩子有一个xs:schema元素作为孩子,那么架构需要允许它拥有这样的孩子。允许它的最简单方法是使用通配符:

<xs:sequence>
  <xs:any processContents="skip" namespace="http://www.w3.org/2001/XMLSchema"
          minOccurs="0" maxOccurs="1"/>
  <xs:element name="item" type="xs:string"
          maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
Run Code Online (Sandbox Code Playgroud)

  • 我错了。我*几乎*和@Michael做了同样的事情。但是你的答案(我忽略了)使它起作用的关键是`namespace="http://www.w3.org/2001/XMLSchema"`。这使得它只匹配 `&lt;xs:...` 标签。一个我包括你的命名空间限制,它通过了验证。谢谢@迈克尔! (2认同)