Oracle能否在本地文件系统上使用XSD模式验证XML?

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

我想问一个关于XML文档根据其对应的XML模式进行验证的问题,如果您能帮助我,我将不胜感激。实际上,我刚刚开始学习XML模式(我完全是初学者)。我已经购买了Priscilla Walmsley写的书“权威XML模式”(第二版),该书介绍了XMLSchema 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文档无效”中了解到,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"