【问题标题】:How to parse XML in PL/SQL如何在 PL/SQL 中解析 XML
【发布时间】:2012-12-25 12:49:36
【问题描述】:

我在 pl/sql 中有以下 xml 结构:

<struct>
  <member>
    <name>CODE</name>
    <value>
      <integer>0</integer>
    </value>
  </member>
  <member>
    <name>MSG</name>
    <value>
      <string>Some message</string>
    </value>
  </member>
</struct>

如何使用名称标签中的文本提取路径 /member/value/some_type 中的值? 我的意思是这样的:

extract('//member/value/*[filter name tag = CODE]').getStringValue

【问题讨论】:

    标签: sql xml oracle xpath plsql


    【解决方案1】:

    您可以使用local-name() 实现此目的

    XPath 应该是,

    //member/value/*[local-name()='CODE']
    

    示例:

    1. //member/value/*[local-name()='integer']
    2. //member/value/*[local-name()='string']

    结果:

    1. 0
    2. 一些消息

    更新:

    在这种情况下,您的 XPath 应该是

    //member[*='CODE']/*/*
    //member[*='MSG']/*/*
    

    结果:

    1. 0
    2. 一些消息

    【讨论】:

    • 使用您的示例,我只能过滤整数/字符串等。但我需要使用//成员/名称值进行过滤
    • @DigitalGod:更新了答案。
    • 现在我得到了正确的过滤器,但错误的值 - 0 而不是 0
    • @DigitalGod: Xpath 是//member[*='CODE']/*/*/text()
    【解决方案2】:

    简短的回答是您不会将数据库视为 ETL(提取、转换、加载)工具。您要做的是将此 XML 文件传递​​给使用 XPath 的单独程序并以这种方式处理它。数据库只应该存储数据。事实上,在过去的 5 个月里,我一直在删除像这样的“异国情调”代码,这些代码使得 Oracle 数据库需要 72 多个小时才能插入 40 万行。所以再次将其偏移到 xpath

    查询看起来与上面的命令几乎相同

    【讨论】:

    • 目前情况下,我只能使用存储过程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多