Может ли 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
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, используемый во время регистрации, который позволяет найти и идентифицировать однозначно конкретную схему. И это была именно моя ошибка, Я думал, что оракул ищет для физического расположения файла.если целевая XML-схема объявляет целевое пространство имен, атрибут schemaLocation используется для идентификации XML-схемы. Значение этого атрибута представляет собой пару значений, разделенных пробелом:
- значение целевого пространства имен, объявленного в схеме XML
- подсказка местоположения схемы, уникальная идентификатор передан процедуре DBMS_XMLSCHEMA.registerSchema, когда схема зарегистрирована в базе данных
заключение: я зарегистрировал схему в 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-схема еще не зарегистрирована, такие документы экземпляра не основывались на схеме при загрузке. Они оставайтесь не основанными на схеме после регистрации схемы.
вы должны удалить такие документы экземпляра и перезагрузить их после Регистрация схемы для получения документов на основе схемы.
вы можете поместить схему в тот же каталог, что и XML, который ссылается на него. В этом случае вам нужно только указать имя файла, как это:
xsi:noNamespaceSchemaLocation="Example-01.xsd"
(допустимая относительная ссылка URI)