我对Xpath有点迷茫,我正在尝试从XML中获取属性,我目前正在使用:
XMLTABLE('/attrs/attr[@name="ImagesWEB"]/string'
PASSING XMLTYPE(XML)
COLUMNS IMAGESWEB VARCHAR2(100) PATH '.'
)但是我需要一个属性名为Image2的其他值,所以我做了另一个XMLTABLE,但是我想这不是正确的方法,我必须使用XMLTABLE(‘/attrs/attr’)。有两列,但不知道如何获得两者(Image2可能从XML数据中丢失)表单XPATH?
这里有一个XML示例(针对我的产品的CLOB):
<attrs>
<attr multiple="true" name="Image2">
<string>IMG2.PNG</string>
<string>IMG3.PNG</string>
<string>IMG4</string>
</attr>
<attr multiple="true" name="ImagesWEB">
<string>IMG.PNG</string>
</attr>
<attr name="ShortLink">
<string>/PRODUCT.html</string>
</attr>
<attr name="TITRE">
<string>TITLE</string>
</attr>
<attr name="name">
<string>PRODUCT</string>
</attr>
</attrs>
Thansk!发布于 2021-03-29 11:03:17
您可以更改主XPath以获取attrs,然后在XPathfor每个columns子句中筛选所需的内容:
XMLTABLE('/attrs'
PASSING XMLTYPE(XML)
COLUMNS
IMAGESWEB VARCHAR2(100) PATH 'attr[@name="ImagesWEB"]/string',
IMAGE2 VARCHAR2(100) PATH 'attr[@name="Image2"]/string'
)db<>fiddle有一些虚构的数据.
但是,如果我有两个值(可能会发生),该怎么办?
如果您可以在一个属性下拥有多个string节点,那么您可以从一个XMLTable调用中获得两个attr节点,然后再有两个attr节点(每个攻击一个)来获取字符串:
SELECT t.id, x2.imagesweb, x3.image2
FROM your_table t
CROSS APPLY
XMLTABLE('/attrs'
PASSING XMLTYPE(t.XML)
COLUMNS
IMAGESWEB XMLTYPE PATH 'attr[@name="ImagesWEB"]',
IMAGE2 XMLTYPE PATH 'attr[@name="Image2"]'
) x1
OUTER APPLY
XMLTABLE('/attr/string'
PASSING x1.imagesweb
COLUMNS
IMAGESWEB VARCHAR2(100) PATH '.'
) x2
OUTER APPLY
XMLTABLE('/attr/string'
PASSING x1.image2
COLUMNS
IMAGE2 VARCHAR2(100) PATH '.'
) x3ID IMAGESWEB IMAGE2
-- --------- ----------
1 ABC DEF
2 ABC
3 DEF
3 DEF2
4 IMG.PNG IMG2.PNG
4 IMG.PNG IMG3.PNG
4 IMG.PNG IMG4db<>fiddle混合了合成数据和样本数据.
这使用交叉应用和外部应用(因为其中一个或另一个属性可能不存在),这些属性是可用的来自Oracle 12c (12.1.0.1)。
https://stackoverflow.com/questions/66852434
复制相似问题