发布此消息是因为我无法找到答案。如果已经存在,请道歉。
问题:我有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>
答案 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