我想问一个关于针对相应 XML 模式进行 XML 文档验证的问题,如果您能帮帮我,我将不胜感激。实际上,我刚刚开始学习 XML 模式(我完全是个初学者)。我购买了 Priscilla Walmsley(第 2 版)编写的“Definitive XML Schema”一书,其中介绍了 XML Schema 1.1(我相信它是最新版本)。
现在的问题是,在本书的所有示例和练习中,模式文件的名称空间和位置都是使用 Web URL 给出的。
这是本书的一个例子:
这是架构
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://datypic.com/prod"
xmlns:prod="http://datypic.com/prod">
<xs:element name="product" type="prod:ProductType"/>
<xs:complexType name="ProductType">
<xs:sequence>
<xs:element name="number" type="xs:integer"/>
<xs:element name="size" type="prod:SizeType"/>
</xs:sequence>
<xs:attribute name="effDate" type="xs:date"/>
</xs:complexType>
<xs:simpleType name="SizeType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="2"/>
<xs:maxInclusive value="18"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
而要针对上述验证的 XML 内容是这样的
<prod:product xmlns:prod="http://datypic.com/prod"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://datypic.com/prod prod.xsd"
effDate="2011-04-12">
<number>557</number>
<size>10</size>
</prod:product>
显然,[http://datypic.com/prod] 是作者维护的站点,因此在阅读本书时,我无法在此站点上添加或删除任何文件以进行练习。因此,我需要将 XML 和 XSD 文档都放在本地硬盘上(我使用的是 Linux Fedora Core 17 X86_64)。所以我所做的就是将架构的内容放在一个名为“Example- 01.xsd ”的文件中,并将 XML 内容放在一个名为“ Example-01.xml ”的文件中。
我使用 oracle PL/SQL 包 DBMS_XMLSCHEMA(企业版 11.2.0.1.0)首先注册架构,然后调用 XMLType 对象的 validate 方法,以便根据架构验证我的 XML 文档,类似于以下链接:
https://forums.oracle.com/forums/thread.jspa?messageID=2462207
我在 oracle 中创建了一个目录(通过 CREATE DIRECTORY)语句:
/home/train/Documents/myutl_file_dir/
我把我的 XML 和 XSD 文档放在哪里。这正是我更改上述 XML 内容以便在本地引用 XSD 的方式
<prod:product xmlns:prod="http://datypic.com/prod"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://datypic.com/prod file:///home/train/Documents/myutl_file_dir/Example-01.xsd"
effDate="2011-04-12">
<number>557</number>
<size>10</size>
</prod:product>
因此,如果您将新的 XML 内容与上述示例进行比较,我添加的唯一内容是file:///home/train/Documents/myutl_file_dir/Example-01.xsd在xsi:schemaLocation的值末尾命令指的是本地硬盘。我在这里找到了这个方法:
http://lists.w3.org/Archives/Public/xmlschema-dev/2001Dec/0161.html
现在,问题是它不起作用。当我运行脚本以通过调用 XMLType 对象的 schemaValidate() 方法来验证文档时,这里是 oracle 错误消息:
BEGIN
*
ERROR at line 1:
ORA-19030: Method invalid for non-schema based XML Documents.
ORA-06512: at "SYS.XMLTYPE", line 354
ORA-06512: at "TRAIN2012.ZXML_PKG", line 176
ORA-06512: at line 2
我从错误消息“ Method invalid for non-schema based XML Documents”中了解到,oracle 只是忽略了我为模式文件定义的文件路径,它认为没有为此 XML 文档声明任何模式。
任何的想法?我该如何处理这个问题?
提前致谢,
达里约什