【问题标题】:Xquery - Selecting value from XML using XMLtableXquery - 使用 XMLtable 从 XML 中选择值
【发布时间】:2013-09-24 09:15:24
【问题描述】:

我想使用 XQuery 在以下 XML 中显示 FrequencyCdvalue="01"city type="first" 的值。

你能帮帮我吗

<Envelope>
<Arrangement>
<FrequencyCd value="01">first first</FrequencyCd> 
<FrequencyCd value="02">first second</FrequencyCd> 
<contactinfo> <Address>
<street>234 Rolling Lane</street> 
<city type="first">Rockport</city> 
</Address>
<email>love2fish@finmail.com</email> 
</contactinfo>
</Arrangement>
<Arrangement>
<FrequencyCd value="03">second first</FrequencyCd> 
<FrequencyCd value="04">second second</FrequencyCd> 
<contactinfo>
<Address>
<street>234 Straight Lane</street> 
<city type="first">Crackport</city> 
</Address>
<email>hate2fish@finmail.com</email> 
</contactinfo>
</Arrangement>
</Envelope>

【问题讨论】:

  • 您要显示什么值? xpath /Envelope/Arrangement[FrequencyCd/@value='01' and contactinfo/Address/city/@type='first'] 应该可以帮助您入门。
  • 非常感谢开发人员 - 我能够为此获取 XPATH,但是当我尝试将其放入 Xquery 中时(实际上我们需要一个 DB2 查询)并显示频率代码 01 和城市类型 = 第一

标签: xml db2 xquery


【解决方案1】:

这种方法在内部分解更多行,但允许复合过滤条件(FrequencyCd 和 City 的条件)作为分解 XML 数据(XMLTABLE 函数的输出)的 SQL 表示的简单 WHERE 子句实现。

with origxml(xdoc) AS (VALUES XMLPARSE( DOCUMENT 
    '<Envelope>
    <Arrangement>
    <FrequencyCd value="01">first first</FrequencyCd> 
    <FrequencyCd value="02">first second</FrequencyCd> 
    <contactinfo> <Address>
    <street>234 Rolling Lane</street> 
    <city type="first">Rockport</city> 
    </Address>
    <email>love2fish@finmail.com</email> 
    </contactinfo>
    </Arrangement>
    <Arrangement>
    <FrequencyCd value="03">second first</FrequencyCd> 
    <FrequencyCd value="04">second second</FrequencyCd> 
    <contactinfo>
    <Address>
    <street>234 Straight Lane</street> 
    <city type="first">Crackport</city> 
    </Address>
    <email>hate2fish@finmail.com</email> 
    </contactinfo>
    </Arrangement>
    </Envelope>'
    )
)
SELECT filteredxml.FrequencyCd, filteredxml.City FROM origxml,
XMLTABLE ('$d/Envelope/Arrangement' PASSING origxml.xdoc AS "d"
                COLUMNS
                FrequencyCd     VARCHAR(20) PATH    'FrequencyCd[@value="01"]/text()',
                City            VARCHAR(30) PATH    'contactinfo/Address/city[@type="first"]/text()'
            ) as filteredxml
WHERE filteredxml.FrequencyCd IS NOT NULL
AND filteredxml.City IS NOT NULL
;                   

【讨论】:

  • 非常感谢 Fred - 这很有效 - 另外我还有一个要求,我应该在哪里使用 //(即 XML 中存在的任何位置),即使用 // Arrangement/FrequencyCd[@value=" 01"] 但是当我尝试时我得到一个错误。
  • 非常感谢 Fred - 这很有效 - 另外我还有一个要求,我应该在哪里使用 //(即 XML 中存在的任何位置),即使用 // Arrangement/FrequencyCd[@value=" 01"] 但是当我尝试时我得到一个错误。 - 我还尝试删除 '$d/Envelope/Arrangement' - 感谢您的帮助 SELECT filteredxml.FrequencyCd, filteredxml.City FROM testxml,XMLTABLE ('$d/Envelope/Arrangement' PASSING testxml.contact AS "d" COLUMNS FrequencyCd VARCHAR( 20) PATH '//FrequencyCd[@value="02"]/text()',City VARCHAR(30) PATH '//contactinfo/Address/city[@type="first"]/text()') 为过滤的xml
  • 这是一个示例 XML,我的实际要求是处理更大的 xml - 我想知道有没有办法可以在同一个 Xquery 中引用不同的路径,例如 //ABC/DEF/ GHI 和 ??MNO/PQR/STU
  • XMLTABLE 需要知道您的行生成表达式是什么才能工作。如果您的 XML 文档没有以一种有意义的方式组织为表,那么您将无法在单个 XMLTABLE 调用中获得所需的结果。在这些情况下,您可以将多个 XMLTABLE 表达式连接在一起,或者通过 XSLTRANSFORM 运行文档以从根本上重新组织它,以使其与一个 XMLTABLE 表达式一起使用。
猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 2013-09-06
  • 1970-01-01
  • 2012-02-04
相关资源
最近更新 更多