sql—从配置单元表中的xml字符串中提取数据,而不使用xpath

oyjwcjzk  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(404)

我尝试使用视图从配置单元表中单个列中的大型xml字符串中提取字符串(值)。我需要获取公司id、销售ind和结帐ind的相关foo\u字符串值。

<Message>
        <Header>
            <FOO_STRING>
                <FOO_STRING_NAME>COMPANY_ID</FOO_STRING_NAME>
                <FOO_STRING_VALUE>44-1235</FOO_STRING_VALUE>
            </FOO_STRING>
            <FOO_STRING>
                <FOO_STRING_NAME>SALE_IND</FOO_STRING_NAME>
                <FOO_STRING_VALUE>Y</FOO_STRING_VALUE>
            </FOO_STRING>
            <FOO_STRING>
                <FOO_STRING_NAME>CLOSING_IND</FOO_STRING_NAME>
                <FOO_STRING_VALUE>Y</FOO_STRING_VALUE>
            </FOO_STRING>
        </Header>
    </Message>

xml文件最多可以有50个“foo\u字符串”,并且不能保证它们的顺序,因此我不能使用xpath,除非我为每个名称/值对调用了50个xpath\u字符串并在以后进行匹配。我像这样使用xpath。。。。。

xpath_string(xml_txt, '/Message/Header/FOO_STRING[1]/FOO_STRING_VALUE') AS String_Val_1                   
       xpath_string(xml_txt, '/Message/Header/FOO_STRING[2]/FOO_STRING_VALUE') AS String_Val_2                                                        
       xpath_string(xml_txt, '/Message/Header/FOO_STRING[3]/FOO_STRING_VALUE') AS String_Val_3

但是,如果顺序发生变化,它就不起作用。我想知道是否有一个快速的方法找到 FOO_STRING_NAME 需要,并使用 regexp_extract() 或者其他方式?我不熟悉regex,所以任何帮助或建议都会很有帮助,谢谢

emeijp43

emeijp431#

“如果订单发生变化,它就不能工作”
那就不要用位置。

xpath_string(xml_txt, '/Message/Header/FOO_STRING[FOO_STRING_NAME="COMPANY_ID"]/FOO_STRING_VALUE') AS String_Val_1                   
xpath_string(xml_txt, '/Message/Header/FOO_STRING[FOO_STRING_NAME="SALE_IND"]/FOO_STRING_VALUE') AS String_Val_2                                                        
xpath_string(xml_txt, '/Message/Header/FOO_STRING[FOO_STRING_NAME="CLOSING_IND"]/FOO_STRING_VALUE') AS String_Val_3

相关问题