我想写一个sql查询来获取soap xml中两个标签之间的数据,这些标签出现在oracle表的clob列中

Posted

技术标签:

【中文标题】我想写一个sql查询来获取soap xml中两个标签之间的数据,这些标签出现在oracle表的clob列中【英文标题】:i want write a sql query to fetch data between two tags in soap xml which present in the clob column of a oracle table 【发布时间】:2021-11-15 16:59:45 【问题描述】:
xml which is present ina clob column of xml_message table : 
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:oag="http://gateway.consumerhub.commercial.volvocars.net/oagis" xmlns:oag1="http://www.openapplications.org/oagis" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <oag:UpdateConsumerAndOpportunityData_v1 xmlns:ns3="http://www.ford.com/oagis">
            <oag1:ApplicationArea>
                <oag1:Sender>
                    <oag1:LogicalId>Volvo</oag1:LogicalId>
                    <oag1:Component>Vista</oag1:Component>
                    <oag1:Task>SyncConsumer</oag1:Task>
                    <oag1:AuthorizationId>AUTH-SK034</oag1:AuthorizationId>
                </oag1:Sender>
                <oag1:CreationDateTime>2016-01-27T15:07:47Z</oag1:CreationDateTime>
                <oag1:BODId>sk-connect-034</oag1:BODId>
            </oag1:ApplicationArea>
            <oag:DataArea>
                <oag1:Sync confirm="Always">
                    <oag1:SyncCriteria expressionLanguage="XPath">
                        <oag1:SyncExpression action="change"/>
                    </oag1:SyncCriteria>
                </oag1:Sync>
                <oag:Consumer>
                    <oag:Header>
                        <oag:Source>AU</oag:Source>
                    </oag:Header>
                    <oag:ConsumerDetails Category="Person">
                        <oag:ConsumerId/>
                        <oag:Language>EN</oag:Language>
                        <oag:PersonDetails>
                            <oag:FirstName>firstname_email_034</oag:FirstName>
                            <oag:Surname>sname_email_034</oag:Surname>
                        </oag:PersonDetails>
                        <oag:EmailAddress Active="true">ticc888@yahoo.com</oag:EmailAddress>
                        <oag:EmailAddress Active="true" Usage="Business">ahng2@hotmail.com</oag:EmailAddress>
                        <oag:EmailAddress Active="true" Usage="Invoice">jsmith@gmail.com</oag:EmailAddress>
                    </oag:ConsumerDetails>
                </oag:Consumer>
            </oag:DataArea>
        </oag:UpdateConsumerAndOpportunityData_v1>
    </soapenv:Body>
</soapenv:Envelope>

现在我希望这个 xml 中的所有电子邮件地址都可以获取并插入到另一个表中。 这个 xml 包含 3 个电子邮件地址,我想要直到 n 个电子邮件地址被提取,一个 xml 文件将包含

【问题讨论】:

这能回答你的问题吗? Select Data out of XML from a column in ORACLE database 【参考方案1】:

如链接答案所示,您可以使用 XMLTable 提取多个值;但您至少需要定义您使用的名称空间,并正确构建 XPath。因此,只需获取您可以执行的电子邮件地址:

select x.emailaddress
from xml_message m
cross apply xmltable (
  xmlnamespaces (
      'http://schemas.xmlsoap.org/soap/envelope/' as "soapenv",
      'http://gateway.consumerhub.commercial.volvocars.net/oagis' as "oag",
      'http://www.openapplications.org/oagis' as "oag1",
      'http://www.ford.com/oagis' as "ns3"
  ),
  'soapenv:Envelope/soapenv:Body/oag:UpdateConsumerAndOpportunityData_v1/oag:DataArea/oag:Consumer/oag:ConsumerDetails/oag:EmailAddress'
  passing xmltype(m.xml_clob)
  columns
    EmailAddress varchar2(64) path '.'
) x;
EMAILADDRESS
ticc888@yahoo.com
ahng2@hotmail.com
jsmith@gmail.com

XPath 没有引用 oag1 或 ns3,但无论如何包含它们并没有什么坏处,您可能需要它们从同一个 XML 文档中提取其他信息。

这还可以让您一次提取多个值;或基于属性进行过滤 - 例如,您可能只想包含属性 Active 设置为 true 的电子邮件地址,您可以通过将该条件添加到 XPath 来实现:

  'soapenv:Envelope/soapenv:Body/oag:UpdateConsumerAndOpportunityData_v1/oag:DataArea/oag:Consumer/oag:ConsumerDetails/oag:EmailAddress[@Active="true"]'

db<>fiddle

您可以阅读有关操作 XML 的更多信息in the documentation。

【讨论】:

太棒了。这对我有用。非常感谢 如果我也想在同一个 xml 中获取联系人号码,该怎么办:9898989898756565212121414141 @AshwiniJoshi - 只需将 XPath 和列子句更改为您想要的节点; db<>fiddle。在一个查询中获取两者比较棘手,因为这两条数据之间没有明显的相关性 - 如果使用是唯一的,那么您可以将一些与之对齐,但您必须弄清楚如何处理不匹配和重复如果允许(例如两个手机号码)。

以上是关于我想写一个sql查询来获取soap xml中两个标签之间的数据,这些标签出现在oracle表的clob列中的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 获取 XML 节点中的值

SQL语句查询当月数据

用python处理xml文件并且用soap发送

SQL 日期函数问题;我想写一个查询语句,是查表中日期字段后十天的数据

我想写两个plsql程序。在一个过程中获取数据并从第二个过程中打印出来

如何获取 XML 文件(存储在 SQL DB 中)的大小?