2012-11-04 13 views
7

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

Odpowiedz

7

OK, po wielu Googling i dzięki Stefan nebesnak”skomentować znalazłem dwa problemy który spowodował błąd:

Pierwszy, jak wspomniał Stefan, że DBMS_XMLSCHEMA.registerSchema można zastosować tylko do dokumentu opartego na schemacie. Początkowo, co zrobiłem w moim kodu PL/SQL było coś takiego:

Więc jak widać nie ma absolutnie żadnego związku między zarejestrowanego schematu i obiektu XMLType który odnosi się do mojego dokumentu XML. To, co musiałem zrobić, to:

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

Pierwszy problem został rozwiązany, a mój dokument XML stał się oparty na schemacie.

Drugim problemem był fakt, że w książce dokument XML mają być sprawdzane przed schematu zostały zdefiniowane w następujący sposób:

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

Co zrozumiałem z "XSI: schemaLocation =" http: //datypic.com/prod prod.xsd "" było to, że pierwsza jego część, to znaczy http://datypic.com/prod odnosi się do targetNameSpace, a druga część jest oddzielona spacją, czyli , prod.xsd, jest używany w celu wskazania lokalizacji (jako adresu URL) dokumentu schematu, który jest prawdziwy . Ale nie wiedziałem, że w implementacji Oracle DBMS_XMLSCHEMA ta druga część musi być tym samym adresem URL, który został użyty do zarejestrowania schematu przez wywołanie metody DBMS_XMLSCHEMA.RegisterSchema, w przeciwnym razie nie będzie działać. A tu jest link do dokumentacji Oracle, który to potwierdza:

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

If the target XML schema declares a target namespace, then the schemaLocation attribute is used to identify the XML schema. The value of this attribute is a pair of values separated by a space:

  • the value of the target namespace declared in the XML schema
  • the schema location hint, the unique identifier passed to procedure DBMS_XMLSCHEMA.registerSchema when the schema is registered with the database

i to było dokładnie to, czego nie zrobił, ja zarejestrowany schemat z "http: // datypic. com/prod "i tylko dlatego, że w książce była nazwa pliku jako druga część xsi: schemaLocation (prod.xsd) Myślałem, że wszystko, co musiałem zrobić, to umieścić zawartość schematu w pliku o nazwie Przykład-01.xsd, a następnie podać adres URL pliku do tego dokumentu, plik: /// home/train/Documents/myutl_file_dir /Example-01.xsd. To było naprawdę głupie, ponieważ po zarejestrowaniu schematu z Oracle przez wywołanie DBMS_XMLSchema.registerSchema, oracle rejestruje zawartość dokumentu schematu XML. Tak więc potrzebna jest Oracle SchemaURL używana podczas rejestracji, która pozwala na znalezienie i identyfikację w wyjątkowy sposób określonego schematu. I to był dokładnie mój błąd, który myślałem, że wyrocznia szuka fizycznej lokalizacji mojego pliku.

Wniosek: ja zarejestrowany schematu przez targetNamespace: „http://datypic.com/prod” (dobrze, to był tylko przykład, mógłbym wybrali inną wartość)

Tak, poprawna wartość schemaLocation w moim dokumencie XML była następująca:

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

I to rozwiązało problem.

Mam nadzieję, że pomoże to tym, którzy napotkali ten sam problem.

Pozdrawiam,

Dariyoosh

0

metoda może być wywołana tylko na schematu opiera obiektów XMLType.

Spróbuj usunąć i ponownie załadować dokumenty, zanim zarejestrujesz odwołanie do schematu XML.

Oracle XML DB Developer's Guide:

When you register an XML schema, keep in mind that the act of registering a schema has no effect on the status of any instance documents already loaded into Oracle XML DB Repository that reference the XML schema. Because the XML schema was not yet registered, such instance documents were non-schema-based when they were loaded. They remain non-schema-based after the schema is registered.

You must delete such instance documents, and reload them after registering the schema, in order to obtain schema-based documents.

Oracle XML Storage Tutorial.

Schemat można umieścić w tym samym katalogu, do którego odwołuje się XML. W tym przypadku trzeba tylko podać nazwę pliku tak:

xsi:noNamespaceSchemaLocation="Example-01.xsd" 

(obowiązuje w stosunku odniesienia URI)

+0

Cóż, jak powiedział, że zmienił dokument XML jak this Ale znowu pojawia się ten sam błąd. – dariyoosh

+0

@ 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

Powiązane problemy