2012-11-04 18 views
7

Tôi muốn đặt câu hỏi về xác thực tài liệu XML đối với (các) lược đồ XML tương ứng và tôi sẽ đánh giá cao nếu bạn có thể cho tôi một tay. Trên thực tế, tôi vừa mới bắt đầu tìm hiểu về các lược đồ XML (tôi hoàn toàn là người mới bắt đầu). Tôi đã mua cuốn sách "Lược đồ XML dứt khoát" được viết bởi Priscilla Walmsley (ấn bản lần 2) trình bày Lược đồ XML 1.1 (mà tôi tin là phiên bản mới nhất).Oracle có thể xác nhận hợp lệ XML bằng cách sử dụng lược đồ XSD trên hệ thống tệp cục bộ không?

Bây giờ vấn đề là trong tất cả các ví dụ và thực hành của cuốn sách, không gian tên và vị trí của tệp lược đồ được cung cấp bằng cách sử dụng URL web.

Dưới đây là một ví dụ về cuốn sách:

Đây là schema

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

Và nội dung XML để được xác nhận chống lại nêu trên được này

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

Rõ ràng, [ http://datypic.com/prod] là một trang web được duy trì bởi tác giả, vì vậy tôi không thể thêm hoặc XÓA bất kỳ tệp nào trên trang web này cho các bài tập của tôi trong khi tôi đang đọc cuốn sách này. Kết quả là tôi cần phải đặt cả hai tài liệu XML và XSD trên ổ cứng cục bộ của mình (tôi đang sử dụng Linux Fedora Core 17 X86_64). Vì vậy, những gì tôi đã làm, là đặt nội dung của lược đồ vào một tệp có tên ví dụ 'Example-01.xsd' và nội dung XML trong một tệp có tên 'Example-01.xml'.

Tôi sử dụng gói PL/SQL oracle DBMS_XMLSCHEMA (Enterprise Edition 11.2.0.1.0) để đăng ký lược đồ đầu tiên và sau đó gọi phương thức xác thực của đối tượng XMLType để xác thực tài liệu XML của tôi dựa trên lược đồ, tương tự liên kết sau:

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

tôi đã tạo ra một thư mục (bằng cách tạo thư mục) tuyên bố trong oracle:

/home/tàu/Documents/myutl_file_dir/

Tôi đặt cả tài liệu XML & XSD của mình ở đâu. Đây chính xác là cách tôi thay đổi nội dung XML nêu trên để tham khảo XSD tại địa phương

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

Vì vậy, nếu bạn so sánh nội dung XML mới với ví dụ nêu trên, điều duy nhất mà tôi đã thêm là file:///home/train/Documents/myutl_file_dir/Example-01.xsd ở cuối giá trị xsi: schemaLocation để tham chiếu đến ổ đĩa cứng cục bộ. Tôi thấy phương pháp này, ở đây:

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

Bây giờ, vấn đề là nó không hoạt động. Khi tôi chạy kịch bản của tôi để xác nhận các tài liệu bằng cách gọi phương thức schemaValidate() của đối tượng XMLType, đây là thông báo lỗi 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 

Những gì tôi hiểu từ các thông báo lỗi 'Phương pháp không hợp lệ cho phi Các tài liệu XML dựa trên lược đồ ' là oracle đơn giản đã bỏ qua filepath mà tôi đã định nghĩa cho tệp lược đồ và nó xem xét rằng không có bất kỳ lược đồ nào được khai báo cho tài liệu XML này.

Bất kỳ ý tưởng nào? Làm thế nào tôi có thể đối phó với vấn đề này?

Cảm ơn trước,

Dariyoosh

Trả lời

7

OK, sau rất nhiều Googling và nhờ stefan nebesnak' bình luận tôi thấy hai vấn đề gây ra lỗi:

Điều đầu tiên, như Stefan đã đề cập là DBMS_XMLSCHEMA.registerSchema chỉ có thể được áp dụng cho tài liệu dựa trên lược đồ. Ban đầu những gì tôi đã làm trong mã PL/SQL của tôi là một cái gì đó như thế này:

Như bạn có thể thấy có là hoàn toàn không có mối liên hệ giữa các lược đồ đã đăng ký và đối tượng XMLType nó liên quan tới tài liệu XML của tôi. Những gì tôi phải làm là:

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

Vì vậy, vấn đề đầu tiên đã được giải quyết và tài liệu XML của tôi trở thành dựa trên lược đồ.

Vấn đề thứ hai là một thực tế rằng trong cuốn sách tài liệu XML để được xác nhận dựa trên giản đồ đã được xác định theo cách sau:

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

Những gì tôi hiểu từ 'xsi: schemaLocation = "http: //datypic.com/prod prod.xsd " 'là phần đầu tiên của nó, có nghĩa là, http://datypic.com/prod đề cập đến targetNameSpace và phần thứ hai được phân tách bằng dấu cách, nghĩa là , prod.xsd, được sử dụng để tham chiếu đến vị trí (dưới dạng URL) của tài liệu lược đồ đúng . Nhưng những gì tôi không biết, đó là trong việc thực hiện DBMS_XMLSCHEMA oracle, phần thứ hai này phải là cùng một URL được sử dụng để đăng ký lược đồ bằng cách gọi phương thức DBMS_XMLSCHEMA.RegisterSchema, nếu không nó sẽ không hoạt động. Và đây là các liên kết đến các tài liệu oracle mà xác nhận điều này:

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

Và đó là chính xác những gì tôi đã không được thực hiện, tôi đã đăng ký schema với 'http: // datypic. com/prod 'và chỉ vì trong sách có tên tệp là phần thứ hai của xsi: schemaLocation (prod.xsd) Tôi nghĩ rằng tất cả những gì tôi phải làm là đặt nội dung lược đồ vào một tệp có tên Example-01.xsd và sau đó cung cấp URL của tệp cho tài liệu này, tệp: /// home/train/Documents/myutl_file_dir /Example-01.xsd. Đó thực sự là một điều ngớ ngẩn bởi vì, khi bạn đăng ký một lược đồ với oracle bằng cách gọi DBMS_XMLSchema.registerSchema, oracle đăng ký nội dung của tài liệu lược đồ XML. Vì vậy, những gì oracle nhu cầu là schemaURL được sử dụng trong quá trình đăng ký cho phép để tìm và xác định duy nhất các lược đồ cụ thể. Và đây chính xác là sai lầm của tôi, tôi đã nghĩ rằng oracle đang tìm kiếm vị trí vật lý của tập tin của tôi.

Kết luận: Tôi đã đăng ký schema bởi targetNameSpace: 'http://datypic.com/prod' (tốt, đó chỉ là một ví dụ, tôi có thể chọn giá trị khác)

Vì vậy, chính xác giá trị của schemaLocation bên trong tài liệu XML của tôi là:

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

Và điều này giải quyết được vấn đề.

Tôi hy vọng điều này có thể giúp những người gặp phải vấn đề tương tự.

Kính trọng,

Dariyoosh

0

Phương pháp này có thể được gọi vào chỉ schema dựa đối tượng xmltype.

Thử xóa và tải lại tài liệu, trước khi đăng ký một lược đồ XML mà họ tham chiếu.

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.

Bạn có thể đặt giản đồ trong cùng thư mục với XML tham chiếu đến nó. Trong trường hợp này, bạn chỉ cần xác định tên tập tin như thế này:

xsi:noNamespaceSchemaLocation="Example-01.xsd" 

(có giá trị tương đối URI tham khảo)

+0

Vâng như bạn nói tôi đã thay đổi các tài liệu XML như thế này Nhưng một lần nữa tôi gặp lỗi tương tự. – dariyoosh

+0

@ stefan nebesnak Tôi sử dụng targetNameSpace và do đó xsi: noNamespaceSchemaLocation không thích hợp cho vấn đề này. Cũng chỉ có lược đồ được tích hợp (nghĩa là tôi đã đăng ký vào cơ sở dữ liệu), tài liệu XML chỉ là một đối tượng XMLType cục bộ có phạm vi giới hạn ở một DECLARE cục bộ ... BEGIN ... END; PL/SQL khối vì vậy không cần phải xóa và tải lại tài liệu vì chúng không được tích hợp sẵn. Tuy nhiên, tôi cảm ơn bạn đã nhận xét (mà tôi không biết) và các liên kết – dariyoosh

Các vấn đề liên quan