使用SQL解析XML

时间:2018-10-09 12:51:16

标签: sql-server sql-server-2016

我正在使用MS SQL2016,我有一个XML文件,我需要对其进行分析以将各种数据元素放入单独的字段中。在大多数情况下,所有内容都可以找到,除了我需要一点帮助来识别特定的节点值。如果有的话(我在这里只放了一段xml,但确实显示了问题)

             DECLARE @xmlString xml
             SET @xmlString ='<PubmedArticle>
               <MedlineCitation Status="PubMed-not-MEDLINE" Owner="NLM">
              <PMID Version="1">25685064</PMID>
              <Article PubModel="Electronic-eCollection">
              <Journal>                
             <ISSN IssnType="Electronic">1234-5678</ISSN>
             <ISSN IssnType="Print">1475-2867</ISSN>
            <JournalIssue CitedMedium="Print">
                <Volume>15</Volume>
                <Issue>1</Issue>
                <PubDate>
                    <Year>2015</Year>
                </PubDate>
            </JournalIssue>
           </Journal>
            </Article>
          </MedlineCitation>
         </PubmedArticle>'

select      
    nref.value('Article[1]/Journal[1]/ISSN[1]','varchar(max)') ISSN                 
    from @xmlString.nodes ('//MedlineCitation[1]') as R(nref)

我绕过第二个ISSNType并读取第一个可用的值。我需要同时提取两个值。我需要更改什么?谢谢

1 个答案:

答案 0 :(得分:1)

您可以阅读第二栏:

SELECT      
    nref.value('Article[1]/Journal[1]/ISSN[1]','varchar(max)') ISSN,
    nref.value('Article[1]/Journal[1]/ISSN[2]','varchar(max)') ISSN2                 
FROM @xmlString.nodes('//MedlineCitation[1]') as R(nref)

SELECT
    nref.value('ISSN[1]','varchar(max)') ISSN,
    nref.value('ISSN[2]','varchar(max)') ISSN2
FROM @xmlString.nodes('//MedlineCitation[1]/Article[1]/Journal[1]') as R(nref)

或作为单独的行:

SELECT nref.value('.','varchar(MAX)') ISSN
from @xmlString.nodes('//MedlineCitation[1]/Article[1]/Journal[1]/ISSN') as R(nref)

更新

如果ISSN的数量可能有所不同,建议您对结果集进行标准化:

SELECT
    nref.value('.','varchar(MAX)') Issn,
    nref.value('@IssnType','varchar(MAX)') IssnType
FROM @xmlString.nodes('//MedlineCitation[1]/Article[1]/Journal[1]/ISSN') as R(nref)