Разбор XML с использованием SQL - PullRequest
0 голосов
/ 09 октября 2018

Я использую 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 голосов
/ 09 октября 2018

Вы можете прочитать как второй столбец:

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)
...