错误消息ORA-19279:尝试在PL / SQL中创建XML文件的视图时收到XPTY0004有两个名称相同的XML标签

问题描述

下面是我下面的XML消息:

<copy SourceFiles="@(File)" DestinationFiles="$(TargetDir)netcore50\%(RecursiveDir)%(Filename)%(Extension)"></copy> 

对于此xml消息,我的XML标签隐私

的三倍

如何在不获取错误的情况下为所有这些人获得独特的隐私价值?

现在我正在使用下面包含错误的下一个查询

<Message xmlns="http://test.org">
    <Request Promotion="MULANN">
        <ExpireDate>23/10/2020 07:10</ExpireDate>
        <Entries>
            <Entry>
                <Product>
                    <Product Product="T1" />
                </Product>
                <Payment>
                    <Privacy>N</Privacy>
                </Payment>
            </Entry>
            <Entry>
                <Product>
                    <Product Product="T2" />
                </Product>
                <Payment>
                    <Privacy>N</Privacy>
                </Payment>
            </Entry>
            <Entry>
                <Product>
                    <Product Product="T3" />
                </Product>
                <Payment>
                    <Privacy>Y</Privacy>
                </Payment>
            </Entry>            
        </Entries>
    </Request>
</Message>

我想得到这样的东西:

select distinct x.Promotion,x.Privacy
  from TableName a
  cross join XMLTable(XMLNAMESPACES('http://test.org' AS "XML"),'/XML:Message' passing xmltype(xml_info) columns
                Promotion VARCHAR2(20) path 'XML:Request/@Promotion'
                Iban_TABD CHAR(1)      path 'XML:Request/XML:Entries/XML:Entry/XML:Payment/XML:Privacy')x

解决方法

问题在于 XML 具有多层嵌套。 您可以通过链接 XMLTABLE 来解决这个问题。

如果在嵌套的子级中并非所有信息都始终可用,则外连接会有所帮助。

SELECT DISTINCT
       promotion,privacy
  FROM TableName,XMLTABLE( XMLNAMESPACES( DEFAULT 'http://test.org'),'/Message' PASSING XMLTYPE(xml_info)
       COLUMNS promotion   VARCHAR2(20)   PATH 'Request/@Promotion',entries     XMLTYPE        PATH 'Request/Entries/Entry'
       ) x1
 LEFT OUTER JOIN (
       XMLTABLE( XMLNAMESPACES( DEFAULT 'http://test.org'),'/Entry' PASSING x1.entries
       COLUMNS privacy     VARCHAR2(1)    PATH 'Payment/Privacy'
       )) x2
       ON 1=1;