Oracle能否在本地文件系统上使用XSD模式验证XML?
我想问一个关于XML文档根据其对应的XML模式进行验证的问题,如果您能帮助我,我将不胜感激。实际上,我刚刚开始学习XML模式(我完全是初学者)。我已经购买了Priscilla Walmsley写的书“权威XML模式”(第二版),该书介绍了XMLSchema 1.1(我认为这是最新版本) 现在的问题是,在本书的所有示例和练习中,模式文件的名称空间和位置都是使用web URL给出的 以下是本书的一个例子: 这是模式Oracle能否在本地文件系统上使用XSD模式验证XML?,xml,oracle,plsql,xml-parsing,xsd,Xml,Oracle,Plsql,Xml Parsing,Xsd,我想问一个关于XML文档根据其对应的XML模式进行验证的问题,如果您能帮助我,我将不胜感激。实际上,我刚刚开始学习XML模式(我完全是初学者)。我已经购买了Priscilla Walmsley写的书“权威XML模式”(第二版),该书介绍了XMLSchema 1.1(我认为这是最新版本) 现在的问题是,在本书的所有示例和练习中,模式文件的名称空间和位置都是使用web URL给出的 以下是本书的一个例子: 这是模式 <xs:schema xmlns:xs="http://www.w3.org
<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文档无效”中了解到,oracle只是忽略了我为模式文件定义的文件路径,它认为没有为此XML文档声明任何模式
有什么想法吗?我如何处理这个问题
提前感谢,
Dariyoosh该方法只能在基于模式的xmltype对象上调用 在注册文档引用的XML模式之前,请尝试删除并重新加载文档 : 注册XML模式时,请记住 注册架构对任何实例的状态都没有影响 已加载到引用的Oracle XML DB存储库中的文档 XML模式。由于XML模式尚未注册,因此 实例文档在加载时不是基于架构的他们 注册架构后保持非基于架构。 您必须删除此类实例文档,然后重新加载它们 注册架构,以获取基于架构的文档 您可以将模式与引用它的XML放在同一目录中。在这种情况下,您只需要像这样指定文件名:
xsi:noNamespaceSchemaLocation="Example-01.xsd"
l_xml_file_content := XMLType('Here I put the content of my XML document')
l_xml_file_content.schemaValidate();
(有效的相对URI引用)好的,经过大量的谷歌搜索,感谢stefan nebesnak的评论,我发现了两个导致错误的问题: 第一个,正如Stefan提到的,DBMS_XMLSCHEMA.registerSchema只能应用于基于模式的文档。最初,我在PL/SQL代码中所做的是这样的:
xsi:noNamespaceSchemaLocation="Example-01.xsd"
l_xml_file_content := XMLType('Here I put the content of my XML document')
l_xml_file_content.schemaValidate();
因此,正如您所看到的,注册的模式和引用我的XML文档的XMLType对象之间绝对没有链接。我必须做的是:
l_xml_file_content :=
XMLType(
'Here I put the content of my XML document'
).createSchemaBasedXML('and here I put the very same schema URL used during registereation while I registered the schema by calling the DBMS_XMLSCHEMA.registerSchema method')
xsi:schemaLocation="http://datypic.com/prod prod.xsd
http://datypic.com/prod prod.xsd"
因此,第一个问题得到了解决,我的XML文档变成了基于模式的文档
第二个问题是,在本书中,要根据模式验证的XML文档的定义如下:
<prod:product xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:prod="http://datypic.com/prod"
xsi:schemaLocation="http://datypic.com/prod prod.xsd"
effDate="2011-04-12">
<number>557</number>
<size>10</size>
</prod:product>
这就解决了问题
我希望这能帮助那些遇到同样问题的人
问候,
Dariyoosh正如您所说,我更改了XML文档,如557 10所示,但再次出现相同的错误。@stefan nebesnak我使用targetNameSpace,因此xsi:noNamespaceSchemaLocation不适合此问题。此外,只有模式是内置的(我的意思是注册到数据库中),XML文档只是一个本地XMLType对象,其范围仅限于本地声明。。。开始。。。结束;PL/SQL块,因此不需要删除和重新加载文档,因为它们不是内置的。然而,我感谢你的评论(我不知道)和链接
xsi:schemaLocation="http://datypic.com/prod prod.xsd
http://datypic.com/prod prod.xsd"