Oracle xml错误

Oracle xml错误,xml,oracle,Xml,Oracle,在Oracle 11gr2上,我在表中导入了一个xml文件: INSERT INTO MS386_XML_TEMPLATE VALUES (SYSDATE, pvNomeFile, xmltype(bfilename(myDirectory, pvNomeFile), nls_charset_id('UTF8'))); 当我在此表上选择时,出现以下错误: SELECT TBELENCOPOD.POD FROM ( SELECT XMLCast(TBPOD.COLUMN_VALUE AS

在Oracle 11gr2上,我在表中导入了一个xml文件:

INSERT INTO MS386_XML_TEMPLATE
VALUES (SYSDATE, pvNomeFile,
xmltype(bfilename(myDirectory, pvNomeFile), nls_charset_id('UTF8')));
当我在此表上选择时,出现以下错误:

SELECT TBELENCOPOD.POD
FROM 
(
SELECT 
  XMLCast(TBPOD.COLUMN_VALUE AS VARCHAR2(20)) AS POD
 FROM table(
       XMLSequence(
       XMLTYPE(Cursor(SELECT * FROM     MS386_XML_TEMPLATE)).extract('/ROWSET/ROW/XML_FILE/edi_l/trader/idrif     idrich/hdr/pod')
     )
    ) TBPOD) TBELENCOPOD LEFT JOIN MS038_METERS TBPOD ON
    TBELENCOPOD.POD=TBPOD.POD
    WHERE
     TBPOD.POD IS NULL
GROUP BY
 TBELENCOPOD.POD;

ORA-31011: ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing 
LPX-00204: syntax error
Error at line 7
ORA-06512: a "SYS.XMLTYPE", line 343
ORA-06512: a line 1
31011. 00000 -  "XML parsing failed"
*Cause:    XML parser returned an error while trying to parse the document.
*Action:   Check if the document to be parsed is valid.
xml是有效的,我已经用验证器检查过了。 非常感谢,
伊戈尔 @鲍勃·贾维斯:谢谢;以下是一些文件行:

<?xml version = '1.0' encoding = 'UTF-8'?><!DOCTYPE edi_l SYSTEM "DTD_ReportFatturato_CONNESSIONE_02_2013.dtd">
<edi_l>
   <trader cdisp="DP1901">
      <idrif idrich="1512543258">
         <hdr>
            <odn>915000591962</odn>
            <pod>IT001E08654958</pod>
            <presa>027292224</presa>
            <cf>MNNMHL78H67L669B</cf>
            <piva/>
            <tdoc>F</tdoc>
            <dat>07.08.2015</dat>
            <pfra>0000003.3</pfra>
            <pdis>000000003.3</pdis>
            <tcon>0000220</tcon>
            <tf>0000000000027.59</tf>
         </hdr>
         <pos>
            <cau>52</cau>
            <scau>09</scau>
            <codiva>A4</codiva>
            <udm/>
            <qta>000000000.0</qta>
            <pzu>00000.000000</pzu>
            <impp>000000027.59</impp>
         </pos>
      </idrif>
      <idrif idrich="1512540815">
....

915000591962
IT001E08654958
027292224
MNNMHL78H67L669B
F
07.08.2015
3.3
3.3
0000220
27.59
52
09
A4
0
0
27.59
....
@博奈斯特@Alex Poole:谢谢你的回复;我是Oracle XML数据库的新手,我知道我正在做很多事情或犯很多错误! 我粘贴了一个正在处理的xml文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE edi_l SYSTEM "DTD_AAA_02_2013.dtd">
<edi_l>
<trader cdisp="zzzzzzz">
<idrif idrich="1111111111">
<hdr>
  <odn>915000591962</odn>
  <pod>IT111111111111</pod>
  <presa>027292224</presa>
  <cf>AAAAAAAAAAAAAAA</cf>
  <piva></piva>
  <tdoc>F</tdoc>
  <dat>07.08.2015</dat>
  <pfra>0000003.3</pfra>
  <pdis>000000003.3</pdis>
  <tcon>0000220</tcon>
  <tf>0000000000027.59</tf>
</hdr>
<pos>
  <cau>52</cau>
  <scau>09</scau>
  <codiva>A4</codiva>
  <udm></udm>
  <qta>000000000.0</qta>
  <pzu>00000.000000</pzu>
  <impp>000000027.59</impp>
</pos>
</idrif>
<idrif idrich="2222222222">
<hdr>
  <odn>915000591962</odn>
  <pod>IT222222222222</pod>
  <presa>027290063</presa>
  <cf>BBBBBBBBBBBBBBBBB</cf>
  <piva></piva>
  <tdoc>F</tdoc>
  <dat>07.08.2015</dat>
  <pfra>0000003.3</pfra>
  <pdis>000000003.3</pdis>
  <tcon>0000220</tcon>
  <tf>0000000000027.59</tf>
</hdr>
<pos>
  <cau>52</cau>
  <scau>09</scau>
  <codiva>A4</codiva>
  <udm></udm>
  <qta>000000000.0</qta>
  <pzu>00000.000000</pzu>
  <impp>000000027.59</impp>
</pos>
</idrif>
</trader>
</edi_l>

915000591962
IT111111111
027292224
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
F
07.08.2015
3.3
3.3
0000220
27.59
52
09
A4
0
0
27.59
915000591962
它是2222222
027290063
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
F
07.08.2015
3.3
3.3
0000220
27.59
52
09
A4
0
0
27.59
如果数据库中不存在“pod”,我想获取它的所有数据,并创建一个新的有效xml文件(未找到每个pod一个)。例如,假设没有找到pod IT111111;Oracle必须生成以下文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE edi_l SYSTEM "DTD_AAA_02_2013.dtd">
<edi_l>
<trader cdisp="zzzzzzz">
<idrif idrich="1111111111">
<hdr>
  <odn>915000591962</odn>
  <pod>IT111111111111</pod>
  <presa>027292224</presa>
  <cf>AAAAAAAAAAAAAAA</cf>
  <piva></piva>
  <tdoc>F</tdoc>
  <dat>07.08.2015</dat>
  <pfra>0000003.3</pfra>
  <pdis>000000003.3</pdis>
  <tcon>0000220</tcon>
  <tf>0000000000027.59</tf>
</hdr>
<pos>
  <cau>52</cau>
  <scau>09</scau>
  <codiva>A4</codiva>
  <udm></udm>
  <qta>000000000.0</qta>
  <pzu>00000.000000</pzu>
  <impp>000000027.59</impp>
</pos>
</idrif>
</trader>
</edi_l>

915000591962
IT111111111
027292224
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
F
07.08.2015
3.3
3.3
0000220
27.59
52
09
A4
0
0
27.59
谢谢, Igor

这一功能有效(同样适用于原始文件中的dtd-->特别感谢Marco Gralike):

但是为什么,如果我从文件中删除该行:

<!DOCTYPE edi_l SYSTEM "DTD_ReportFatturato_CONNESSIONE_02_2013.dtd">  
要忽略dtd:这样,表中的文件加载工作正常,但原始查询不起作用:

SELECT TBELENCOPOD.POD
FROM 
(
SELECT 
  XMLCast(TBPOD.COLUMN_VALUE AS VARCHAR2(20)) AS POD
 FROM table(
       XMLSequence(
       XMLTYPE(Cursor(SELECT * FROM     MS386_XML_TEMPLATE)).extract('/ROWSET/ROW/XML_FILE/edi_l/trader/idrif     idrich/hdr/pod')
     )
    ) TBPOD) TBELENCOPOD LEFT JOIN MS038_METERS TBPOD ON
    TBELENCOPOD.POD=TBPOD.POD
    WHERE
     TBPOD.POD IS NULL
GROUP BY
 TBELENCOPOD.POD;
谢谢,
Igor

这一功能有效(同样适用于原始文件中的dtd-->特别感谢Marco Gralike):

但是为什么,如果我从文件中删除该行:

<!DOCTYPE edi_l SYSTEM "DTD_ReportFatturato_CONNESSIONE_02_2013.dtd">  
要忽略dtd:这样,表中的文件加载工作正常,但原始查询不起作用:

SELECT TBELENCOPOD.POD
FROM 
(
SELECT 
  XMLCast(TBPOD.COLUMN_VALUE AS VARCHAR2(20)) AS POD
 FROM table(
       XMLSequence(
       XMLTYPE(Cursor(SELECT * FROM     MS386_XML_TEMPLATE)).extract('/ROWSET/ROW/XML_FILE/edi_l/trader/idrif     idrich/hdr/pod')
     )
    ) TBPOD) TBELENCOPOD LEFT JOIN MS038_METERS TBPOD ON
    TBELENCOPOD.POD=TBPOD.POD
    WHERE
     TBPOD.POD IS NULL
GROUP BY
 TBELENCOPOD.POD;
谢谢,

Igor

请编辑您的问题并包括XML文件的前15行。谢谢。您能提供一个完整的xml文档来生成输出以及您希望返回的输出吗?我猜XMLTABLE()将是解决方案的一部分,但如果没有我所要求的两部分信息,就很难提供帮助。除了提取路径中的空格之外,您所显示的内容似乎有效,它得到的是“LPX-00601:Invalid token”,而不是语法错误。正在加载的XML必须有效,否则插入时会出错。如前所述,请发布一个生成您看到的错误的最小完整XML文档,以及您正在使用的实际提取路径。然而,由于extract和XMLSequence已被弃用,所以您要用一种复杂的方法来实现这一点。看起来您确实应该使用XMLTable;但是,在不清楚是什么原因导致了您看到的错误的情况下,不确定这是否足以避免它。仅供参考,如果您在问题测试中仅在评论中提到我们,我们不会收到通知。我仍然没有从您添加的示例XML中得到错误;在11.2.0.3或11.2.0.4中;也许你在较早的补丁级别?(唯一的区别是我没有您的DTD,所以我将从XML中删除它)。实际上,您希望删除
idrif
节点,其
pod
值存在于另一个表中,对吗?如果一个文档最终没有节点-留下一个空的
交易者
节点,或者根本没有文档怎么办?@AlexPoole-Alex感谢您的回复;是的,你是对的:我删除了该行:并且没有生成错误;那么,我如何在原始文件中保留这一行呢?我执行语句execute IMMEDIATE('alter session set events=''31156 trace name context FORWARE,level 2'');在Oracle软件包的开始,但似乎没有任何变化。谢谢,Igor。请编辑您的问题并包括XML文件的前15行。谢谢。您能提供一个完整的xml文档来生成输出以及您希望返回的输出吗?我猜XMLTABLE()将是解决方案的一部分,但如果没有我所要求的两部分信息,就很难提供帮助。除了提取路径中的空格之外,您所显示的内容似乎有效,它得到的是“LPX-00601:Invalid token”,而不是语法错误。正在加载的XML必须有效,否则插入时会出错。如前所述,请发布一个生成您看到的错误的最小完整XML文档,以及您正在使用的实际提取路径。然而,由于extract和XMLSequence已被弃用,所以您要用一种复杂的方法来实现这一点。看起来您确实应该使用XMLTable;但是,在不清楚是什么原因导致了您看到的错误的情况下,不确定这是否足以避免它。仅供参考,如果您在问题测试中仅在评论中提到我们,我们不会收到通知。我仍然没有从您添加的示例XML中得到错误;在11.2.0.3或11.2.0.4中;也许你在较早的补丁级别?(唯一的区别是我没有您的DTD,所以我将从XML中删除它)。实际上,您希望删除
idrif
节点,其
pod
值存在于另一个表中,对吗?如果一个文档最终没有节点-留下一个空的
交易者
节点,或者根本没有文档怎么办?@AlexPoole-Alex感谢您的回复;是的,你是对的:我删除了该行:并且没有生成错误;那么,我如何在原始文件中保留这一行呢?我执行语句execute IMMEDIATE('alter session set events=''31156 trace name context FORWARE,level 2'');在Oracle软件包的开头