我想问一个关于XML文档验证的问题,以及它相应的XML模式,如果您能帮我一把,我将不胜感激。其实,我刚开始学习XML模式(我完全是一个初学者)。我购买了由Priscilla Walmsley(2nd Edition)编写的书“Definitive XML Schema”,该书介绍了XML Schema 1.1(我认为它是最新版本)。Oracle可以使用本地文件系统上的XSD模式验证XML吗?
现在的问题是,在本书的所有示例和实践中,架构文件的名称空间和位置都是使用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(通过创建目录)声明:
/家庭/火车/文档/ 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内容,我添加的唯一的事情就是文件:/ //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
我从错误信息“方法无效,不能用于非懂什么基于模式的XML文档'是oracle已经简单地忽略了我为模式文件定义的文件路径,并且它认为没有为这个XML文档声明任何模式。
有什么想法?我该如何处理这个问题?
由于提前,
Dariyoosh
那么就像你说的,我改变了XML文档类似这样 prod:product>但是我又得到了同样的错误。 –
dariyoosh
@ stefan nebesnak我使用targetNameSpace,因此xsi:noNamespaceSchemaLocation不适用于此问题。也只有模式是内置的(我的意思是注册到数据库中),XML文档只是一个局部的XMLType对象,其范围仅限于本地的DECLARE ... BEGIN ... END; PL/SQL块,因此不需要删除和重新加载文档,因为它们不是内置的。然而,我感谢你的评论(我不知道)和链接 – dariyoosh