越来越名称和值从甲骨文的XMLType属性(getting name and value from

2019-09-27 03:43发布

描述

您好,我有在甲骨文的XMLType值提取属性名称和值的问题。 基本上,我有一个表,假设TableA ,其中有一个XMLType列,让我们称之为TableA_config 。 在值TableA_config具有结构是这样的: <TableAConfig someAttribute1="value1" someAttribute2="value2" someAttribute3="value3" /> 属性及其名称的数量可能会有所不同,而不是事先知道的。 我需要做的是(每行)创建一个名为新的XMLElement TableAConfigList ,其中包含XMLElements称为TableAConfig而且每个都有两个属性: namevalue 。 现在,数TableAConfig节点必须等于在属性数TableA_config列,并且每个保持对应于属性的名称name属性,它在数值value属性。

从:

<TableAConfig someAttribute1="value1" someAttribute2="value2" someAttribute3="value3" />

我应该得到:

<TableAConfigList>
    <TableAConfig name="someAttribute1" value="value1"/>
    <TableAConfig name="someAttribute2" value="value2"/>
    <TableAConfig name="someAttribute3" value="value3"/>
</TableAConfigList>

我试着

我想出了主意,以创建一个XMLTableTableA_config列值,并在其中创建两列,这是我以后可以选择。 它看起来是这样的(这是一个更大的查询的片段):

SELECT XMLElement("TableAConfigList",
    (SELECT
        XMLAgg(
           XMLElement("TableAConfig",
                XMLAttributes(
                    tmp."attr_name" as "name",
                    tmp."attr_text" as "value"
                )
            )
        ) from XMLTable('/TableAConfig/@*'
            passing TableA.TableA_config
            columns
               "attr_name" varchar(30) path 'name()',
               "attr_text" varchar(30) path 'text()'
        ) tmp
    )
) from dual

但现在我得到:

<TableAConfigList>
    <TableAConfig name="someAttribute1"></TableAConfig>
    <TableAConfig name="someAttribute2"></TableAConfig>
    <TableAConfig name="someAttribute3"></TableAConfig>
</TableAConfigList>

没有value 。 但是,如果我删除nameXMLAttributes它显示了。 从:

SELECT XMLElement("TableAConfigList",
    (SELECT
        XMLAgg(
           XMLElement("TableAConfig",
                XMLAttributes(
                    tmp."attr_text" as "value"
                )
            )
        ) from XMLTable('/TableAConfig/@*'
            passing TableA.TableA_config
            columns
               "attr_name" varchar(30) path 'name()',
               "attr_text" varchar(30) path 'text()'
        ) tmp
    )
) from dual

我得到:

<TableAConfigList>
    <TableAConfig value="value1"></TableAConfig>
    <TableAConfig value="value2"></TableAConfig>
    <TableAConfig value="value3"></TableAConfig>
</TableAConfigList>

我想,也许,出于某种原因,只能有这种方式创建一个属性,但如果我通过硬编码添加一个新的,它显示的结果,就像这样:

SELECT XMLElement("TableAConfigList",
    (SELECT
        XMLAgg(
           XMLElement("TableAConfig",
                XMLAttributes(
                    tmp."attr_text" as "value",
                    'testValue' as "testAttribute"
                )
            )
        ) from XMLTable('/TableAConfig/@*'
            passing TableA.TableA_config
            columns
               "attr_name" varchar(30) path 'name()',
               "attr_text" varchar(30) path 'text()'
        ) tmp
    )
) from dual

结果:

<TableAConfigList>
    <TableAConfig value="value1" testAttribute="testValue"></TableAConfig>
    <TableAConfig value="value2" testAttribute="testValue"></TableAConfig>
    <TableAConfig value="value3" testAttribute="testValue"></TableAConfig>
</TableAConfigList>

在把XMLAttributes列和硬编码的一个给了我nametestAttribute ,但没有value

有人能告诉我是因为我错过了什么非常明显的,它是一个错误还是我这样做完全错误的。 我非常新的Oracle和PL / SQL,可能真的很感谢你的帮助。 谢谢!

Answer 1:

你几乎有你的第一次尝试。 虽然评估的XPath,当你与属性列表内/TableAConfig/@* ,你不需要text()获取里面的属性值。 你已经在使用这样只是一个“点”属性级别. 对于当前节点就足够了。

因此,尝试这样的事情 -

SELECT XMLElement("TableAConfigList",
    (SELECT
        XMLAgg(
           XMLElement("TableAConfig",
                XMLAttributes(
                    tmp."attr_name" as "name",
                    tmp."attr_text" as "value"
                )
            )
        ) from XMLTable('/TableAConfig/@*'
            passing TableA.TableA_config
            columns
               "attr_name" varchar(30) path 'name()',
               "attr_text" varchar(30) path '.'
        ) tmp
    )
) from dual

从你的第一次尝试,唯一的区别是的XPath的value属性。



Answer 2:

您可以使用XMLTRANSFORM太:

select xmltransform(
       xmltype('<TableAConfig someAttribute1="value1" someAttribute2="value2" someAttribute3="value3" />'),
       xmltype('<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:for-each select="TableAConfig">
<TableAConfigList>
            <xsl:for-each select="@*">
                <xsl:element name="TableAConfig" >
                    <xsl:attribute name="name">
                        <xsl:value-of select="name()"/>
                    </xsl:attribute>
                    <xsl:attribute name="value">
                        <xsl:value-of select="."/>
                    </xsl:attribute>
                </xsl:element>
            </xsl:for-each>
</TableAConfigList>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>'))
from dual


文章来源: getting name and value from xmltype attribute in oracle