Chciałbym zadać pytanie dotyczące sprawdzania poprawności dokumentu XML w odniesieniu do jego odpowiednich schematów XML i byłbym wdzięczny, gdybyś mógł mi pomóc. Właściwie dopiero zacząłem poznawać schematy XML (jestem całkowicie początkującym). Kupiłem książkę "Definitive XML Schema" autorstwa Priscilla Walmsley (2nd Edition), która prezentuje XML Schema 1.1 (co moim zdaniem jest najnowszą wersją).Czy Oracle może sprawdzić poprawność XML za pomocą schematu XSD w lokalnym systemie plików?
Problem polega na tym, że we wszystkich przykładach i ćwiczeniach książki obszary nazw i położenie plików schematów są podawane za pomocą adresu URL strony internetowej.
Oto przykład z książki:
Jest to schemat
<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>
a zawartość XML mają być sprawdzane przed wspomniano powyżej jest to
<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>
Oczywiście [ http://datypic.com/prod] to strona prowadzona przez autora, więc nie mogę dodawać ani usuwać żadnych plików na tej stronie do moich ćwiczeń podczas czytania tej książki. W rezultacie muszę umieścić oba dokumenty XML i XSD na moim lokalnym dysku twardym (używam systemu Linux Fedora Core 17 X86_64). Zrobiłem więc zawartość schematu w pliku o nazwie "Example-01.xsd", a zawartość XML w pliku o nazwie "Example-01.xml".
Używam pakietu Oracle/PL/SQL DBMS_XMLSCHEMA (Enterprise Edition 11.2.0.1.0), aby najpierw zarejestrować schemat, a następnie wywołać metodę sprawdzania poprawności obiektu XMLType w celu sprawdzenia poprawności mojego dokumentu XML względem schematu, podobnego do poniższego linku:
https://forums.oracle.com/forums/thread.jspa?messageID=2462207
ja stworzyliśmy katalog (przez utworzenie katalogu) oświadczenie w oracle:
/home/pociąg/Dokumenty/myutl_file_dir/
Gdzie umieszczam oba dokumenty XSD XML &. Oto właśnie jak zmieniłem Powyższy zawartość XML, aby odnieść się do XSD lokalnie
<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>
Więc jeśli porównać nową zawartość XML z wyżej wymienionym przykładzie, jedyną rzeczą, że dodałem było file:///home/train/Documents/myutl_file_dir/Example-01.xsd na końcu wartości xsi: schemaLocation w celu odniesienia się do lokalnego dysku twardego. Znalazłem ten sposób, tutaj:
http://lists.w3.org/Archives/Public/xmlschema-dev/2001Dec/0161.html
Teraz problemem jest to, że nie działa. Kiedy uruchomić mój skrypt w celu zatwierdzenia dokumentu przez wywołanie metody schemaValidate() obiektu XMLType, tutaj jest komunikat o błędzie 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
Co rozumiem z komunikatem o błędzie "Metoda nieważne dla nie- oparty na schemacie dokument XML " jest taki, że oracle po prostu zignorował ścieżkę do pliku, którą zdefiniowałem dla pliku schematu i uważa, że nie było żadnego schematu zadeklarowanego dla tego dokumentu XML.
Każdy pomysł? Jak mogę sobie z tym poradzić?
Dzięki z góry,
Dariyoosh
Cóż, jak powiedział, że zmienił dokument XML jak this prod: product> Ale znowu pojawia się ten sam błąd. –
dariyoosh
@ stefan nebesnak Używam targetNameSpace, a zatem xsi: noNamespaceSchemaLocation nie jest odpowiedni dla tego problemu. Również wbudowany jest tylko schemat (to znaczy zarejestrowany w bazie danych) dokument XML jest tylko lokalnym obiektem XMLType, którego zakres jest ograniczony do lokalnego DECLARE ... BEGIN ... END; Blok PL/SQL, więc nie ma potrzeby usuwania i ponownego ładowania dokumentów, ponieważ nie są one wbudowane. A jednak dziękuję za uwagę (której nie znałem) i linki – dariyoosh