2014-01-24 115 views
0

发布此信息是因为我无法找到答案。道歉,如果它已经存在。当您在SQL Server中的xml中嵌套元素时,只选择叶元素

问题:我有描述具有分类层次结构的物种的XML。我感兴趣的主要元素是一个分类群(<taxoncl>),它从层次结构中从王国的分类层次到层次结构叶子(底层)的物种,亚种或品种等级。我想从主要元素的子元素中选择排名(<taxonrn>),科学名称(<taxonrv>)和常用名称(<common>),但仅限叶节点记录。换句话说,我想选择木鸭的记录(科学名称Aix sponsa),但不是记录,告诉我它在王国Animalia,它是一只鸟(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

我结束了使用SQL Server中的XML数据类型的nodes()方法来获取所有<taxoncl>元素。然后,我在我的WHERE子句中使用SQL Server中XML数据类型的exist()方法来仅对那些不包含其他<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