Может ли Oracle проверить XML с помощью схемы XSD в локальной файловой системе?

Я хотел бы задать вопрос о проверке XML-документа против соответствующих XML-схем, и я был бы признателен, если бы вы могли любезно дать мне руку. На самом деле, я только начал изучать XML-схемы (я совсем новичок). Я купил книгу" Definitive XML Schema", написанную Присциллой Уолмсли (2-е издание), в которой представлена XML-схема 1.1 (которая, я считаю, является самой последней версией).

теперь проблема в том, что во всех примерах и упражнениях книга, пространства имен и расположение файлов схемы задаются с помощью веб-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). Так что я сделал, чтобы поместить содержимое схемы в файл с именем, например'пример-01.xsd-схемы 'и содержимое XML в файле с именем'пример-01.в XML'.

Я использую oracle PL / SQL package DBMS_XMLSCHEMA (Enterprise Edition 11.2.0.1.0) для того, чтобы сначала зарегистрировать схему, а затем вызвать метод validate объекта XMLType для проверки моего XML-документа против схема, аналогичная следующей ссылке:

https://forums.oracle.com/forums/thread.jspa?messageID=2462207

Я создал инструкцию directory (by CREATE DIRECTORY) в 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 довольствуясь вышеупомянутым примером, единственное, что я добавил, Было :///дом/Д/документы/myutl_file_dir/пример-01.xsd-схемы в конце значения xsi: schemaLocation для того, чтобы обратиться к локальному жесткому диску. Я нашел этот метод, здесь:

http://lists.w3.org/Archives/Public/xmlschema-dev/2001Dec/0161.html

теперь проблема в том, что это не работает. Когда я запускаю свой скрипт для проверки документ путем вызова метода schemaValidate () объекта XMLType, вот сообщение об ошибке 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

2 ответов


хорошо, после большого количества Гугля и благодаря комментарию Стефана небеснака я нашел две проблемы, которые вызвали ошибку:

первый, как упоминал Стефан, это DBMS_XMLSCHEMA.registerSchema может применяться только к документу на основе схемы. Первоначально то, что я сделал в моем коде PL / SQL, было примерно так:

l_xml_file_content := XMLType('Here I put the content of my XML document')
l_xml_file_content.schemaValidate();

таким образом, как вы можете видеть, нет абсолютно никакой связи между зарегистрированной схемой и объектом XMLType, который ссылается на мой XML-документ. Что я должен был сделать было так:

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')

Итак, первая проблема была решена, и мой 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>

что я понял из 'xsi: schemaLocation="http://datypic.com/prod прод.xsd-файл"http://datypic.com/prod относится к targetNameSpace и вторая часть разделены пробелом, то есть prod.xsd-схемы, это чтобы ссылаться на местоположение (как URL-адрес) документа схемы, которое является истинным. Но я не знал, что в реализации oracle DBMS_XMLSCHEMA эта вторая часть должна быть тем же URL-адресом, который используется для регистрации схемы путем вызова DBMS_XMLSCHEMA.Метод RegisterSchema, иначе он не будет работать. И вот ссылка на документацию oracle, которая подтверждает это:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14259/xdb03usg.htm#BABBGBDA

если целевая XML-схема объявляет целевое пространство имен, атрибут schemaLocation используется для идентификации XML-схемы. Значение этого атрибута представляет собой пару значений, разделенных пробелом:

  • значение целевого пространства имен, объявленного в схеме XML
  • подсказка местоположения схемы, уникальная идентификатор передан процедуре DBMS_XMLSCHEMA.registerSchema, когда схема зарегистрирована в базе данных
http://datypic.com/prod ' и только потому, что в книге было имя файла как вторая часть xsi: schemaLocation (prod.xsd) я думал, что все, что мне нужно было сделать, это поместить содержимое схемы в файл с именем Example-01.xsd и затем укажите URL-адрес файла для этого документа,:///дом/Д/документы/myutl_file_dir/пример-01.xsd-схемы. Это было действительно глупо, потому что, когда вы регистрируете схему с oracle, вызывая DBMS_XMLSchema.registerSchema, oracle регистрирует содержимое документа схемы XML. Так что oracle нужен schemaURL, используемый во время регистрации, который позволяет найти и идентифицировать однозначно конкретную схему. И это была именно моя ошибка, Я думал, что оракул ищет для физического расположения файла.

заключение: я зарегистрировал схему в targetNameSpace : http://datypic.com/prod (ну, это был просто пример, я мог бы выбрать другое значение)

Итак, правильное значение schemaLocation внутри моего XML-документа было следующим:

xsi:schemaLocation="http://datypic.com/prod prod.xsd 
                    http://datypic.com/prod prod.xsd"

и это решило проблему.

Я надеюсь, это может помочь тем, кто столкнулся с той же проблемой.

С уважением,

Dariyoosh


метод может быть вызван только схема объекты xmltype.

Попробуйте удалить и перезагрузить документы, прежде чем регистрировать XML-схему, на которую они ссылаются.

руководство разработчика Oracle XML DB:

когда вы регистрируете схему XML, имейте в виду, что действие Регистрация схемы не влияет на состояние экземпляра документы, уже загруженные в репозиторий Oracle XML DB, которые ссылаются формат XML схема. Поскольку XML-схема еще не зарегистрирована, такие документы экземпляра не основывались на схеме при загрузке. Они оставайтесь не основанными на схеме после регистрации схемы.

вы должны удалить такие документы экземпляра и перезагрузить их после Регистрация схемы для получения документов на основе схемы.

Oracle XML хранения учебник.

вы можете поместить схему в тот же каталог, что и XML, который ссылается на него. В этом случае вам нужно только указать имя файла, как это:

    xsi:noNamespaceSchemaLocation="Example-01.xsd"

(допустимая относительная ссылка URI)