Oracle XML架构验证日期模式错误

Oracle XML架构验证日期模式错误,xml,oracle,xsd,Xml,Oracle,Xsd,我试图用XSD验证XML。但它在日期格式上抛出了一个奇怪的错误: [1] :LSX-00333:文字“2016-05-26T16:37:42.000000”对于模式无效 但是,我的XML中包含以下内容: <?xml version="1.0" encoding="UTF-8"?> <root DataFeed="2016-04" VersionXSD="2.0" Currency="USD" DataProcessDate="2016-

我试图用XSD验证XML。但它在日期格式上抛出了一个奇怪的错误:

[1] :LSX-00333:文字“2016-05-26T16:37:42.000000”对于模式无效

但是,我的XML中包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<root DataFeed="2016-04" 
      VersionXSD="2.0" 
      Currency="USD" 
      DataProcessDate="2016-05-26T16:37:42" 
      xmlns="http://www.millicom.com">
出于某种原因,它增加了微秒数,但模式检查失败。我怎样才能避免这种情况?
我想要的行为是正确执行,输出为“valid”

您可能正在做类似的事情。 我假设您的数据类型是这样声明的

  <xs:simpleType name="DataProcessDateType">
    <xs:restriction base="xs:dateTime">
       <xs:pattern value="\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}"/>
    </xs:restriction>
  </xs:simpleType>
--exec dbms_XMLSCHEMA.deleteSchema(schemaurl=>test_xsd'); 声明 vxml-xmltype:=xmltype(q'~')


尽管您尚未向我们展示您的数据类型定义,但我的第一直觉是Oracle对规范的解释不正确。我个人认为,将模式与非字符串数据类型一起使用是非常值得怀疑的,但规范非常明确(第2部分,§4.1.4,验证规则Datatype Valid),即模式方面应用于匹配源文档中写入的值(在空白规范化之后),称为“词汇空间中的文字”,然后将其转换为值空间,在其中评估其他方面,如minInclusive和enumeration。我得到的印象是Oracle取而代之的是词法值,将其转换为值空间,然后根据模式测试值的规范词法形式。但这也不对,因为规范的词汇形式不能在小数秒部分包含尾随的零(请参见3.2.7.2)。

编辑以包含您所陈述的内容,而不声明您的
DateTimeType
很难说出哪里出了问题。很抱歉忘记了它,在中编辑了它。尽管阿卡迪乌斯·乌卡塞维茨给我的答案帮助了我。
DECLARE
   v_schema_url   VARCHAR2 (200) := 'MyFact.xsd';
   v_blob         BLOB;
   v_clob         CLOB;
   v_xml          XMLTYPE;
   xml_file BFILE;
   xmlClob CLOB;

   src_offset number := 1 ;
   dest_offset number := 1 ;
   lang_ctx number := DBMS_LOB.DEFAULT_LANG_CTX;
   warning integer;
   res integer;
BEGIN
   dbms_xmlschema.deleteschema(v_schema_url); 
   DBMS_XMLSCHEMA.registerschema (schemaurl   => v_schema_url,
                                  schemadoc   => bfilename ('DIR_XSD','MyFact.xsd'),
                                  local       => TRUE);
   xml_file := BFILENAME('DIR_XSD', 'Test.xml');
   DBMS_LOB.CREATETEMPORARY(xmlClob, true);
   DBMS_LOB.FILEOPEN(xml_file, DBMS_LOB.FILE_READONLY);
   DBMS_LOB.LOADCLOBFROMFILE(xmlClob, xml_file, DBMS_LOB.LOBMAXSIZE, src_offset,
                             dest_offset, DBMS_LOB.DEFAULT_CSID, lang_ctx, warning);

   v_xml := XMLType.createXML(xmldata=>xmlClob,schema=>v_schema_url);

   DBMS_LOB.FILECLOSEALL();
   DBMS_LOB.FREETEMPORARY(xmlClob);

   v_xml.schemaValidate();

   IF v_xml.isschemavalid (v_schema_url) = 1 THEN
      DBMS_OUTPUT.put_line ('valid');
   ELSE
      DBMS_OUTPUT.put_line ('not valid');
   END IF;
END;
  <xs:simpleType name="DataProcessDateType">
    <xs:restriction base="xs:dateTime">
       <xs:pattern value="\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}"/>
    </xs:restriction>
  </xs:simpleType>
 xsd clob := q'~<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"   xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute type="xs:string" name="DataFeed"/>
          <xs:attribute type="xs:float" name="VersionXSD"/>
          <xs:attribute type="xs:string" name="Currency"/>
          <xs:attribute type="DataProcessDateType" name="DataProcessDate"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:simpleType name="DataProcessDateType">
    <xs:restriction base="xs:dateTime">
       <xs:pattern value="\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{6}"/>
    </xs:restriction>
   </xs:simpleType>
</xs:schema>~';
begin 
   DBMS_XMLSCHEMA.registerschema (schemaurl   => 'test_xsd',
                                  schemadoc   => xmltype(xsd),
                                  local       => TRUE);
end;
begin 
  vxml := vxml.createschemabasedxml('test_xsd');
  vxml.schemaValidate();
 IF vxml.isschemavalid ('test_xsd') = 1 THEN
      DBMS_OUTPUT.put_line ('valid');
   ELSE
      DBMS_OUTPUT.put_line ('not valid');
   END IF;
end;