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

标签 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 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>

我正在寻找如何用 XSD 替换 DTD 验证,但找不到任何示例。看起来 XSD 总是需要在单独的文件中定义并由 XML 引用。 XSD 不能在内部使用是真的吗?

最佳答案

原则上你可以这样做:

<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) 您什么时候拥有过仅描述单个实例文档的模式?模式本质上定义了文档类,而这些类很少是单例。

关于xml - 是否可以在内部使用 XML 模式,就像 DTD 一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39336531/

相关文章:

xml - 在 Angular 2 中将 XML 插入 DOM

xml - 甲骨文11g : Extracting and Counting XML elements

java - Android 中如何删除 View 与其轮廓边框之间的多余空格?

java - 在Java中,如何使用DTD根据XML中的光标位置填充可用标签?

xml - 如果 DTD 链接无处可去,会发生什么情况?

javascript - 在xml中调用php变量

xml - 我可以设置 XSD 以便 xs :enumeration is shared between two attributes with a different base type - xs:ID and xs:string

XSD 中的 Java int 类型

c# - 如何获取XSL文件目录的绝对路径?

xml - 如何忽略 XSL 的 !DOCTYPE 声明?