在SQL Server中的xml中嵌套元素时,仅选择叶元素

时间:2014-01-24 18:51:07

标签: xml sql-server-2008-r2

发布此消息是因为我无法找到答案。如果已经存在,请道歉。

问题:我有XML描述具有分类层次结构的物种。我感兴趣的主要元素,分类单元(<taxoncl>),嵌套在层次结构中,从王国的分类等级到等级的叶子(底部)的物种,亚种或品种等级。我想从主要元素的子元素中选择排名(<taxonrn>),科学名称(<taxonrv>)和公用名(<common>),但仅限于叶子记录。换句话说,我想选择Wood duck(科学名称​​ Aix sponsa )的记录,但不是那些告诉我它在动物界王国的记录,而且它是一只鸟(Aves类)。

我想在SQL Server 2008R2中解析XML,以便将其附加到表中。

以下是XML示例:

<?xml version="1.0"?>
<metadata>
    <idinfo>
        <taxonomy>
            <taxoncl>
                <taxonrn>Kingdom</taxonrn>
                <taxonrv>Animalia</taxonrv>
                <taxoncl>
                    <taxonrn>Phylum</taxonrn>
                    <taxonrv>Chordata</taxonrv>
                    <taxoncl>
                        <taxonrn>Subphylum</taxonrn>
                        <taxonrv>Vertebrata</taxonrv>
                        <taxoncl>
                            <taxonrn>Class</taxonrn>
                            <taxonrv>Aves</taxonrv>
                            <taxoncl>
                                <taxonrn>Order</taxonrn>
                                <taxonrv>Anseriformes</taxonrv>
                                <taxoncl>
                                    <taxonrn>Family</taxonrn>
                                    <taxonrv>Anatidae</taxonrv>
                                    <taxoncl>
                                        <taxonrn>Genus</taxonrn>
                                        <taxonrv>Aix</taxonrv>
                                        <taxoncl>
                                            <taxonrn>Species</taxonrn>
                                            <taxonrv>Aix sponsa</taxonrv>
                                            <common>Wood Duck</common>
                                        </taxoncl>
                                    </taxoncl>
                                    <taxoncl>
                                        <taxonrn>Genus</taxonrn>
                                        <taxonrv>Anas</taxonrv>
                                        <taxoncl>
                                            <taxonrn>Species</taxonrn>
                                            <taxonrv>Anas platyrhynchos</taxonrv>
                                            <common>Mallard</common>
                                        </taxoncl>
                                    </taxoncl>
                                </taxoncl>
                            </taxoncl>
                        </taxoncl>
                    </taxoncl>
                </taxoncl>
            </taxoncl>
        </taxonomy>
    </idinfo>
</metadata>

1 个答案:

答案 0 :(得分:0)

我最终在SQL Server中使用XML数据类型的nodes()方法来获取所有<taxoncl>元素。然后,我在exist()子句中使用SQL Server中XML数据类型的WHERE方法仅过滤那些不包含另一个<taxoncl>元素的<taxoncl>元素。

DECLARE @Data XML;
SET @Data = 
'<?xml version="1.0"?>
<metadata>
    <idinfo>
        <taxonomy>
            <taxoncl>
                <taxonrn>Kingdom</taxonrn>
                <taxonrv>Animalia</taxonrv>
                <taxoncl>
                    <taxonrn>Phylum</taxonrn>
                    <taxonrv>Chordata</taxonrv>
                    <taxoncl>
                        <taxonrn>Subphylum</taxonrn>
                        <taxonrv>Vertebrata</taxonrv>
                        <taxoncl>
                            <taxonrn>Class</taxonrn>
                            <taxonrv>Aves</taxonrv>
                            <taxoncl>
                                <taxonrn>Order</taxonrn>
                                <taxonrv>Anseriformes</taxonrv>
                                <taxoncl>
                                    <taxonrn>Family</taxonrn>
                                    <taxonrv>Anatidae</taxonrv>
                                    <taxoncl>
                                        <taxonrn>Genus</taxonrn>
                                        <taxonrv>Aix</taxonrv>
                                        <taxoncl>
                                            <taxonrn>Species</taxonrn>
                                            <taxonrv>Aix sponsa</taxonrv>
                                            <common>Wood Duck</common>
                                        </taxoncl>
                                    </taxoncl>
                                    <taxoncl>
                                        <taxonrn>Genus</taxonrn>
                                        <taxonrv>Anas</taxonrv>
                                        <taxoncl>
                                            <taxonrn>Species</taxonrn>
                                            <taxonrv>Anas platyrhynchos</taxonrv>
                                            <common>Mallard</common>
                                        </taxoncl>
                                    </taxoncl>
                                </taxoncl>
                            </taxoncl>
                        </taxoncl>
                    </taxoncl>
                </taxoncl>
            </taxoncl>
        </taxonomy>
    </idinfo>
</metadata>';

SELECT
    TaxonRank = TaxonomyXML.value('(taxonrn)[1]', 'varchar(20)'),
    SciName = TaxonomyXML.value('(taxonrv)[1]', 'varchar(255)'),
    CommonName = TaxonomyXML.value('(common)[1]', 'varchar(255)')
FROM
    @Data.nodes('/metadata/idinfo/taxonomy//*/taxoncl') AS XTbl(TaxonomyXML)
WHERE
    TaxonomyXML.exist('(taxoncl)[1]')=0;

返回了以下结果:

TaxonRank   SciName              CommonName
Species     Aix sponsa           Wood Duck
Species     Anas platyrhynchos   Mallard