当SQL Server中的xml中有嵌套元素时,仅选择叶元素
因为我找不到答案,所以发了这个帖子。道歉,如果它已经存在 问题:我使用XML描述具有分类层次结构的物种。我感兴趣的主要元素是分类单元(当SQL Server中的xml中有嵌套元素时,仅选择叶元素,xml,sql-server-2008-r2,Xml,Sql Server 2008 R2,因为我找不到答案,所以发了这个帖子。道歉,如果它已经存在 问题:我使用XML描述具有分类层次结构的物种。我感兴趣的主要元素是分类单元(),它嵌套在层次结构中,从王国的分类等级到层次结构叶(底部)的物种、亚种或变种等级。我想从主元素的子元素中选择秩()、学名()和通用名(),但仅针对叶记录。换句话说,我想选择木鸭子(学名aixsponsa)的记录,但不是那些告诉我它在动物王国(kingdom Animalia),它是一只鸟(鸟类类)的记录 我想在SQLServer2008R2中解析XML,以便将其
),它嵌套在层次结构中,从王国的分类等级到层次结构叶(底部)的物种、亚种或变种等级。我想从主元素的子元素中选择秩(
)、学名(
)和通用名(
),但仅针对叶记录。换句话说,我想选择木鸭子(学名aixsponsa)的记录,但不是那些告诉我它在动物王国(kingdom Animalia),它是一只鸟(鸟类类)的记录
我想在SQLServer2008R2中解析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>
王国
动物
门
脊索动物
亚门
脊椎动物
班
鸟类
顺序
鹅形目
家庭
鸭科
属
艾克斯
种
林鸳鸯
木鸭
属
阿纳斯
种
鸭嘴兽
绿头鸭
我最终使用SQL server中XML数据类型的节点()方法来获取所有
元素。然后,我在我的WHERE
子句中使用了SQL Server中XML数据类型的exist()
方法,仅过滤那些不包含另一个
元素的
元素
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