Oracle 为什么DBMS_XMLSCHEMA无法验证有效的xs:dateTime?
我将验证和处理第三方提供的XML。XML符合第三方提供的标准化XML模式 对于验证,我使用DBMS_XMLSCHEMA的基本方式如下:Oracle 为什么DBMS_XMLSCHEMA无法验证有效的xs:dateTime?,oracle,validation,datetime,xsd,oracle11g,Oracle,Validation,Datetime,Xsd,Oracle11g,我将验证和处理第三方提供的XML。XML符合第三方提供的标准化XML模式 对于验证,我使用DBMS_XMLSCHEMA的基本方式如下: -- pseudocode follows declare xmldoc xmltype; begin dbms_xmlschema.registerschema(schemaurl => name, schemadoc => xmltype(schema),
-- 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>
AFAICS2011-06-15T16:58:23+02:00
应该是一个有效的XML模式值,DBMS_XMLSCHEMA不应该对此抱怨。验证也应该独立于任何数据库日期格式设置,对吗
那么,这是否是Oracle的一个怪癖?如果是,解决办法是什么?或者我应该以不同的方式配置Oracle和/或DBMS_XMLSCHEMA吗?或者我误解了什么或者
我正在运行Oracle Database 11g 11.2.0.1.0版
如果值得一提的话,上面的示例XML模式和数据使用Xerces进行了正确验证。我认为您可以通过添加以下内容来解决这一问题:
xdb:SQLType="TIMESTAMP WITH TIME ZONE"
指向XML架构中的元素。虽然这可能会在非时区记录上出错…这只是一个相关Oracle文档的集合,可以回答我的问题。我接受了Phil的回答,因为我找到了基于此的文档的正确部分 从第章: 使用时区 以下XML架构数据类型允许将可选时区指示符作为其文字值的一部分
xsd:dateTime
xsd:time
xsd:date
xsd:gYear
xsd:gMonth
xsd:gDay
xsd:gyearmount
xsd:gMonthDay
xsd:dateTime
和xsd:time
映射到SQL数据类型TIMESTAMP
,并将所有其他数据类型映射到SQL数据类型DATE
。SQL数据类型时间戳
和日期
不允许时区指示器
如果应用程序需要使用时区指示符,则使用属性SQLType
将SQL数据类型指定为TIMESTAMP with timezone
。这可以确保包含时区指示器的值可以正确存储和检索。例如:
<element name="dob" type="xsd:dateTime"
xdb:SQLType="TIMESTAMP WITH TIME ZONE"/>
<attribute name="endofquarter" type="xsd:gMonthDay"
xdb:SQLType="TIMESTAMP WITH TIME ZONE"/>
当我将其添加到示例中时,验证通过了,元素缺少可选时区没有问题。另见。问题在于注释是特定于Oracle的,XML模式由第三方管理。但如何克服这一限制值得另一场辩论。
xdb:SQLType="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"/>