xml - 雪花:无法递归解析 xml
问题描述
我有这个 xml
<product product-id="P001">
<images>
<image-group view-type="vt01">
<image path="IP001">
<title xml:lang="default"></title>
</image>
<image path="IP002">
<title xml:lang="JP"></title>
</image>
<image path="IP003">
<title xml:lang="KOR"></title>
</image>
<image path="IP004">
<title xml:lang="ENG"></title>
</image>
<image path="IP005">
<title xml:lang="RUS"></title>
</image>
<image path="IP006">
<title xml:lang="FRA"></title>
</image>
</image-group>
</images>
</product>
我需要获取列表中每个图像组的所有单个图像详细信息
image group : vt01
image path : IP001
image lang : default
image path : IP002
image lang : JP
image path : IP003
image lang : KOR
image path : IP004
image lang : ENG
image path : IP005
image lang : RUS
image path : IP006
image lang : FRA
我现在只得到一级图像组 细节和一级图像细节。
image group : vt01
image path : IP001
image lang : default
我使用以下代码使用“copyinto”将 XML 加载到 SNOWFLAKE:
WITH SRC AS (SELECT PARSE_XML(CAT_XML) as XML FROM "SAMPLE"."XML_02")
select
t.value:"@view-type" as VIEW_TYPE,
xmlget(t.value,'image'):"@path" as IMAGE_PATH,
xmlget(xmlget(t.value,'image'), 'title'):"@xml:lang" as TITLE_LANG
from SRC s,
table(flatten(input => to_array(xmlget(s.XML,'images'):"$"),recursive=> FALSE)) t
有人可以帮我弄这个吗
解决方案
解析分层 XML 就像解开一个难解的结。您可以嵌套 get、xmlget、lateral 和 flatten 子句,但这变得不可读且难以维护。我推荐的方法是使用 CTE 逐步进行。
您可以测试以下 CTE。它假定您的 XML 位于名为“SRC”的表中,该表位于定义为类型变体的名为“XML”的列中。从那里您可以根据需要进行修改以使用您的副本声明。
with
IMAGES("VALUE") as
(
select "VALUE" from SRC, lateral flatten(SRC.XML:"$") IMAGES where "KEY" = '$'
),
IMAGE_ARRAY(IMAGE) as
(
select I."VALUE" from IMAGES, lateral flatten(IMAGES."VALUE") I where "KEY" = '$'
),
IMAGE(IMAGE_XML) as
(
select "VALUE" from IMAGE_ARRAY, lateral flatten(input => to_array(IMAGE)) IMG
)
select get(IMAGE_XML, '@path')::string as PATH,
get(get(IMAGE_XML, '$'), '@xml:lang')::string as LANG
from IMAGE
;
推荐阅读
- ios - 如何快速将 yyyy-MM-dd'T'HH:mm:ss.SSS'Z' 转换为 MM-dd-yyyy
- apache-spark - 结构流式演示,程序像批处理作业一样立即退出,不连续,火花
- c - 如何回调函数在 C 中的运行时工作
- javascript - 如何使 Javascript 倒计时 24 小时并在 24 小时后淡出 div 元素?
- python - Python mysql fetchall() 返回附加字符
- ruby-on-rails - 如何在rails中为异常编写rspec?
- python - 我已经按照Django的官方教程制作了一个投票应用程序,但我无法继续
- javascript - Vuex store WATCH 和 SUBSCRIBE 的区别
- r - na.rm = TRUE 未能在 unite() 上删除 NA
- php - 如何从该控制器发布多张图像?