Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在配置单元中,如何使用explode(XPATH(..)函数读取XML中的空/空标记?_Sql_Xml_Xpath_Hive_Hiveql - Fatal编程技术网

Sql 在配置单元中,如何使用explode(XPATH(..)函数读取XML中的空/空标记?

Sql 在配置单元中,如何使用explode(XPATH(..)函数读取XML中的空/空标记?,sql,xml,xpath,hive,hiveql,Sql,Xml,Xpath,Hive,Hiveql,在下面的配置单元查询中,我还需要从XML内容中读取null/empty“string”标记。现在在XPATH()列表中只考虑非空的“string”标记 with your_data as ( select '<ParentArray> <ParentFieldArray> <Name>ABCD</Name> <Value> <string>111</st

在下面的配置单元查询中,我还需要从XML内容中读取null/empty“string”标记。现在在
XPATH()
列表中只考虑非空的“string”标记

with your_data as (
select  '<ParentArray>
    <ParentFieldArray>
        <Name>ABCD</Name>
        <Value>
            <string>111</string>
            <string></string>
            <string>222</string>
        </Value>
    </ParentFieldArray>
    <ParentFieldArray>
        <Name>EFGH</Name>
        <Value>
            <string/>
            <string>444</string>
            <string></string>
            <string>555</string>

        </Value>
    </ParentFieldArray>
</ParentArray>' as xmlinfo
)

select Name, Value 
  from your_data d
       lateral view outer explode(XPATH(xmlinfo, 'ParentArray/ParentFieldArray/Name/text()')) pf as  Name
       lateral view outer explode(XPATH(xmlinfo, concat('ParentArray/ParentFieldArray[Name="', pf.Name, '"]/Value/string/text()'))) vl as Value;

这里的问题是
XPATH
返回NodeList,如果它包含空节点,则不包括在列表中

使用某些字符串(在XPATH中)进行连接:
concat(/Value/string/text(),“”)
在这里不起作用:

原因:javax.xml.xpath.XPathExpressionException: com.sun.org.apache.xpath.internal.XPathException:无法转换 #向节点列表添加字符串

在 com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:195)

简单的解决方法是将
替换为
NULL
,然后可以将“NULL”字符串转换为NULL

演示:


您好,您也可以看看下面链接中解释的类似场景吗@leftjoin@RKR好的,回答
Name    Value
ABCD    111
ABCD    
ABCD    222
EFGH    
EFGH    444
EFGH    
EFGH    555
with your_data as (
select  '<ParentArray>
    <ParentFieldArray>
        <Name>ABCD</Name>
        <Value>
            <string>111</string>
            <string></string>
            <string>222</string>
        </Value>
    </ParentFieldArray>
    <ParentFieldArray>
        <Name>EFGH</Name>
        <Value>
            <string/>
            <string>444</string>
            <string></string>
            <string>555</string>
        </Value>
    </ParentFieldArray>
</ParentArray>' as xmlinfo
)

select name, case when value='NULL' then null else value end value
  from (select regexp_replace(xmlinfo,'<string></string>|<string/>','<string>NULL</string>') xmlinfo 
          from your_data d
       ) d
       lateral view outer explode(XPATH(xmlinfo, 'ParentArray/ParentFieldArray/Name/text()')) pf as  Name
       lateral view outer explode(XPATH(xmlinfo, concat('ParentArray/ParentFieldArray[Name="', pf.Name, '"]/Value/string/text()'))) vl as value
name    value
ABCD    111
ABCD    
ABCD    222
EFGH    
EFGH    444
EFGH    
EFGH    555