我在使用 XSD 验证 Oracle 中的 XML CLOB 字段的日期时间值时遇到问题,该 XSD 具有正则表达式来验证日期时间接受的格式。
一切看起来都很好,数据正确,但应用验证时失败因为验证似乎将日期时间值更改为带有 6 个尾随零的格式,即从“2024-03-08T11:56:23”更改为“2024-03-08T11:56:23.000000”,例如
这里是一些重现该行为的代码:
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;
/
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;
/
begin
DBMS_XMLSCHEMA.deleteSchema('testDateTimeWithZone.xsd' ,DBMS_XMLSCHEMA.DELETE_CASCADE);
end;
/
我也尝试过 XMLTYPE(l_xmldoc, 'testDateTimeWithZone.xsd'); 但问题是一样的:(
重要提示:我无法更改 XSD 的正则表达式
我如何才能获得有效的 XSD 验证?
定义 HIREDATE 的架构中存在不正确的类型定义。
<xs:element name="HIREDATE" type="dtTimeWithZone"/>
如果将其更改为....
<xs:element name="HIREDATE" type="xs:dateTime"/>
...工作正常