问题描述
下面是我下面的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;