是否可以像DTD一样在内部使用XML模式?

是否可以像DTD一样在内部使用XML模式?,xml,xsd,dtd,xml-validation,Xml,Xsd,Dtd,Xml Validation,我有以下XML文件,其中包括内部DTD验证: <?xml version="1.0"?> <!DOCTYPE animals [ <!ELEMENT animals (animal)*> <!ELEMENT animal (skin, noise, eyes, diet, class, weight, special_skill)> <!ELEMENT skin (#PCDATA)> <!ELEMENT

我有以下XML文件,其中包括内部DTD验证:

<?xml version="1.0"?>
<!DOCTYPE animals [
    <!ELEMENT animals (animal)*>
    <!ELEMENT animal (skin, noise, eyes, diet, class, weight, special_skill)>
    <!ELEMENT skin (#PCDATA)>
    <!ELEMENT noise (#PCDATA)>
    <!ELEMENT eyes (#PCDATA)>
    <!ELEMENT diet (#PCDATA)>
    <!ELEMENT class (#PCDATA)>
    <!ELEMENT weight (#PCDATA)>
    <!ELEMENT special_skill (#PCDATA)>
    <!ATTLIST animal name CDATA #REQUIRED >
    <!ATTLIST weight unit CDATA "kg">
]>
<animals>
    <animal name="cow">
        <skin>
            Straight fur
        </skin>
        <noise>
            Moo!
        </noise>
        <eyes>
            2
        </eyes>
        <diet>
            Herbivore
        </diet>
        <class>
            Mammalia
        </class>
        <weight unit="kg">
            635-1134
        </weight>
        <special_skill>
            Chewing
        </special_skill>
    </animal>

    <animal name="sheep">
        ...
    </animal>

</animals>

]>
直毛
哞!
2.
食草动物
哺乳动物
635-1134
咀嚼
...

我正在寻找如何用XSD替换DTD验证,但找不到任何示例。似乎XSD总是需要在一个单独的文件中定义,并且XML可以引用它。XSD不能在内部使用,这是真的吗?

不,虽然您可能会找到一些在XML文档实例中嵌入XSD的方法,但XSD没有对应于DTD的标准机制。

原则上您可以:

<package>
  <xs:schema id="XSD">
   ... schema goes here ...
  </xs:schema>
  <doc xsi:noNamespaceSchemaLocation="#XSD">
   ... instance goes here ...
  </doc>
</package>

... 模式在这里。。。
... 实例在这里。。。
但是(a)不能保证任何特定的模式处理器都会支持这种形式的位置URI,并且(b)很难理解这一点

我知道DTD已经完成了,但我从未真正理解:

(i) 如果您想验证一个文档,您肯定想知道它所针对的是什么模式,而不是信任它定义自己的模式?知道“此文档对某些模式有效,但我不知道该模式中包含什么”有什么用

(ii)您何时有过仅描述单个实例文档的模式?模式本质上定义了文档的类,而这些类很少是单例的