xmltype.schemaValidate 更改时间戳值导致正则表达式验证失败

问题描述 投票:0回答:1


我在使用 XSD 验证 Oracle 中的 XML CLOB 字段的日期时间值时遇到问题,该 XSD 具有正则表达式来验证日期时间接受的格式。
一切看起来都很好,数据正确,但应用验证时失败因为验证似乎将日期时间值更改为带有 6 个尾随零的格式,即从“2024-03-08T11:56:23”更改为“2024-03-08T11:56:23.000000”,例如

这里是一些重现该行为的代码:

  1. 要注册 XSD,请使用以下代码:
begin
    DBMS_XMLSCHEMA.registerSchema(schemaURL => 'testDateTimeWithZone.xsd',
        schemaDoc => '<?xml version="1.0" encoding="UTF-8"?>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
        <xs:element name="EMPLOYEE" type="CHECK"/>
        <xs:complexType name="CHECK">
            <xs:sequence>
                <xs:element name="NAME" type="xs:string"/>
                <xs:element name="HIREDATE" type="dtTimeWithZone"/>
            </xs:sequence>
        </xs:complexType>
        <xs:simpleType name="dtTimeWithZone">
            <xs:restriction base="xs:dateTime">
                <xs:pattern value="\d*-\d{2}-\d{2}T(2[0-3]|[0-1][0-9]):[0-5][0-9]:[0-5][0-9](\.[0-9]{3})?(([\-+]((0[0-9])|(1[0-4])):[0-5][0-9])|Z)"/>
            </xs:restriction>
        </xs:simpleType>
        </xs:schema>');
end;
/
  1. 运行以下代码重现故障
declare
    l_xmldoc xmltype;
begin
    dbms_output.put_line('Starting:');
    
    -- build some dummy VALID xml data
    select xmlelement("EMPLOYEE", 
        xmlelement("NAME", 'John'), 
        xmlelement("HIREDATE", '2024-03-08T11:56:23')    
    ) into l_xmldoc from dual;

    l_xmldoc := l_xmldoc.createSchemaBasedXML('testDateTimeWithZone.xsd');
    -- the validation fails!
    xmltype.schemaValidate(l_xmldoc);

    dbms_output.put_line('Finished!');
end;
/
  1. 摆脱 XSD - 或者如果你愿意的话可以保留它:)
begin
    DBMS_XMLSCHEMA.deleteSchema('testDateTimeWithZone.xsd' ,DBMS_XMLSCHEMA.DELETE_CASCADE);
end;
/

我也尝试过 XMLTYPE(l_xmldoc, 'testDateTimeWithZone.xsd'); 但问题是一样的:(
重要提示:我无法更改 XSD 的正则表达式
我如何才能获得有效的 XSD 验证?

oracle xsd xmltype
1个回答
0
投票

定义 HIREDATE 的架构中存在不正确的类型定义。

<xs:element name="HIREDATE" type="dtTimeWithZone"/>

如果将其更改为....

<xs:element name="HIREDATE" type="xs:dateTime"/>

...工作正常

© www.soinside.com 2019 - 2024. All rights reserved.