我将验证和处理第三方提供的XML。 XML符合第三方提供的标准化XML模式。
对于验证,我基本上以这种方式使用DBMS_XMLSCHEMA:
-- pseudocode follows
declare
xmldoc xmltype;
begin
dbms_xmlschema.registerschema(schemaurl => name,
schemadoc => xmltype(schema),
local => true,
gentypes => false,
gentables => false
);
xmldoc := xmltype(xml).createSchemaBasedXML(schema_name);
xmldoc.schemavalidate;
end;
验证似乎有效,只是我运行了下面演示的XML架构类型xs:dateTime
的问题。
使用XML架构:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="datetime-issue">
<xs:complexType>
<xs:sequence>
<xs:element name="time" type="xs:dateTime" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
以下XML的验证:
<?xml version="1.0" encoding="UTF-8"?>
<datetime-issue>
<time>2011-06-15T16:58:23</time>
<!-- Oracle doesn't like timezone ? -->
<time>2011-06-15T16:58:23+02:00</time>
<time>2011-06-16T09:55:01</time>
</datetime-issue>
第二个时间元素意外失败:
ORA-30992: error occurred at Xpath /datetime-issue/time[2]
ORA-01830: date format picture ends before converting entire input string
ORA-06512: at "SYS.XMLTYPE", line 354
AFAICS 2011-06-15T16:58:23+02:00
应该是有效的XML架构xs:dateTime值,DBMS_XMLSCHEMA不应该抱怨它。验证也应该独立于任何数据库日期格式设置,对吗?
这是Oracle的怪癖,如果是,那么解决方法是什么?或者我应该以不同方式配置Oracle和/或DBMS_XMLSCHEMA?或者我误解了某些东西或......
我正在运行Oracle Database 11g第11.2.0.1.0版。
如果值得做任何事情,上面的示例XML架构和数据都会使用Xerces exchangerxml正确验证。
答案 0 :(得分:1)
我认为你可以通过添加:
来解决这个问题xdb:SQLType="TIMESTAMP WITH TIME ZONE"
到XML模式中的元素。虽然这可能是非时区记录的错误......
答案 1 :(得分:0)
这只是一个相关Oracle文档的集合,可以回答我的问题。我接受了Phil的答案,因为我找到了基于此的文档的正确部分。
7 XML Schema Storage and Query: Basic的Oracle XML DB Developer's Guide 11g Release 2 (11.2)章:
使用时区
以下XML Schema数据类型允许将可选的时区指示符作为其文字值的一部分。
xsd:dateTime
xsd:time
xsd:date
xsd:gYear
xsd:gMonth
xsd:gDay
xsd:gYearMonth
xsd:gMonthDay
默认情况下,XML架构注册将
xsd:dateTime
和xsd:time
映射到SQL数据类型TIMESTAMP
,将所有其他数据类型映射到SQL数据类型DATE
。 SQL数据类型TIMESTAMP
和DATE
不允许使用时区指示符。如果您的应用程序需要使用时区指示符,则使用属性
SQLType
将SQL数据类型指定为TIMESTAMP WITH TIME ZONE
。这可确保可以正确存储和检索包含时区指示符的值。例如:<element name="dob" type="xsd:dateTime" xdb:SQLType="TIMESTAMP WITH TIME ZONE"/> <attribute name="endofquarter" type="xsd:gMonthDay" xdb:SQLType="TIMESTAMP WITH TIME ZONE"/>
使用尾随Z表示UTC时区
XML Schema允许将时区组件指定为
Z
,以指示UTC时区。当具有尾随Z
的值存储在SQLTIMESTAMP WITH TIME ZONE
列中时,时区实际存储为+00:00
。因此,检索到的值包含尾随+00:00
,而不是原始Z
。例如,如果输入XML文档中的值为1973-02-12T13:44:32Z
,则输出为1973-02-12T13:44:32.000000+00:00
。
另见: