为什么DBMS_XMLSCHEMA无法验证有效的xs:dateTime? [英] Why DBMS_XMLSCHEMA fails to validate a valid xs:dateTime?

查看:227
本文介绍了为什么DBMS_XMLSCHEMA无法验证有效的xs:dateTime?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将验证并处理由第三方提供的XML。 XML符合第三方提供的标准化XML模式。



对于验证,我使用DBMS_XMLSCHEMA基本上这样:

   - 伪代码跟随
声明
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;
结束

验证似乎工作,除了我已经运行XML模式类型的问题 xs:dateTime ,如下所示。



使用XML架构:

 <?xml version =1.0encoding =UTF-8standalone =否?> 
< xs:schema xmlns:xs =http://www.w3.org/2001/XMLSchema>
< xs:element name =datetime-issue>
< xs:complexType>
< xs:sequence>
< xs:element name =timetype =xs:dateTimemaxOccurs =unbounded/>
< / xs:sequence>
< / xs:complexType>
< / xs:element>
< / xs:schema>

验证以下XML:

 <?xml version =1.0encoding =UTF-8?> 
< datetime-issue>
< time> 2011-06-15T16:58:23< / time>
<! - Oracle不喜欢时区? - >
< time> 2011-06-15T16:58:23 + 02:00< / time>
< time> 2011-06-16T09:55:01< / time>
< / datetime-issue>

第二个时间元素意外失败:



ORA-30992:Xpath / datetime-issue / time [2]发生错误
ORA-01830:转换整个输入字符串之前结束的日期格式图片
ORA-06512:SYS.XMLTYPE,第354行

AFAICS 2011 -06-15T16:58:23 + 02:00 应该是一个有效的XML模式 xs:dateTime 值和DBMS_XMLSCHEMA不应该抱怨这一点。验证还应该独立于任何数据库日期格式设置,对吗?



这是Oracle的怪癖,如果是,有什么解决方法?还是应该配置Oracle和/或DBMS_XMLSCHEMA不同?或者我误解了某些东西或...



我正在运行Oracle数据库11g版本11.2.0.1.0。



如果上述XML模式和数据的示例与 exchangexml 正确验证是否值得,使用Xerces。

解决方案

我想你可以通过添加来修复:

  xdb:SQLType =TIMESTAMP WITH TIME ZONE

到XML模式中的元素。虽然这可能会在非时区记录上出错...


I'm going to validate and process XML provided by a third party. The XML conforms a standardized XML schema also provided by a third party.

For validation I use DBMS_XMLSCHEMA essentially this way:

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

Validation seems to work except that I've run an issue with XML schema type xs:dateTime that is demonstrated below.

With XML schema:

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

The validation of following 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>

Fails unexpectedly on the second time-element:

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 should be a valid XML schema xs:dateTime value and DBMS_XMLSCHEMA should not complain about that at all. Validation should also be independent on any database date format settings, right ?

So is this an Oracle quirk and if yes what are the workarounds ? Or should I configure Oracle and/or DBMS_XMLSCHEMA differently ? Or have I misinterpreted something or ...

I'm running Oracle Database 11g Release 11.2.0.1.0.

If it's worth of anything the example XML schema and data above validates correctly with exchangerxml that uses Xerces.

解决方案

I think you can fix that by adding:

xdb:SQLType="TIMESTAMP WITH TIME ZONE"

to the element in the XML schema. Though that may error on the non-timezone records...

这篇关于为什么DBMS_XMLSCHEMA无法验证有效的xs:dateTime?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆