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

Я пытаюсь очистить некоторый код SQL. В настоящее время у меня есть XML как:

DECLARE @xml xml = N'<PubmedArticleSet>
  <PubmedArticle>
    <MedlineCitation Status="MEDLINE" Owner="NLM">           
      <ArticleIdList>           
        <ArticleId IdType="pii">0092-8674(92)90516-F</ArticleId>
        <ArticleId IdType="pubmed">1423608</ArticleId>
        <ArticleId IdType="doi">10.1016/0092-8674(92)90516-f</ArticleId>
      </ArticleIdList>
    </PubmedData>
  </PubmedArticle>
</PubmedArticleSet>'

И мне нужно получить значение ArticleId с атрибутом

    IdType ="pubmed"

Я хотел бы что-то вроде и XQUERYметод, который мог бы:

DECLARE @PMID NVARCHAR(15)
SET @PMID =  @xml.value('(//PubmedData/ArticleIdList/ArticleId/@IdType)[1]', 'varchar(15)' ) 

Но это тянет IdType "pii" первого узла. И

SET @PMID =  @xml.value('(//PubmedData/ArticleIdList/ArticleId/@IdType = "pubmed")[1]', 'varchar(15)' ) 

Возвращает истину.

Есть ли способ отфильтровать по "опубликованному", а затем получить число 1423608? Так что @PMID будет тогда равно 1423608.

1 Ответ

1 голос
/ 06 октября 2019

Ваш предоставленный XML не правильно сформирован. Отсутствует несколько тегов, надеюсь, что это исправлено здесь:

DECLARE @xml xml = N'<PubmedArticleSet>
  <PubmedArticle>
  <PubmedData>
    <MedlineCitation Status="MEDLINE" Owner="NLM">           
      <ArticleIdList>           
        <ArticleId IdType="pii">0092-8674(92)90516-F</ArticleId>
        <ArticleId IdType="pubmed">1423608</ArticleId>
        <ArticleId IdType="doi">10.1016/0092-8674(92)90516-f</ArticleId>
      </ArticleIdList>
      </MedlineCitation>
    </PubmedData>
  </PubmedArticle>
</PubmedArticleSet>';

DECLARE @IdToFind VARCHAR(100)='pubmed';

SELECT @xml.value('(/PubmedArticleSet
                    /PubmedArticle
                    /PubmedData
                    /MedlineCitation
                    /ArticleIdList
                    /ArticleId[@IdType=sql:variable("@IdToFind")]
                    /text())[1]','int');

Идея вкратце:

  • Мы можем использовать переменную, чтобы сделать это немного более общим.
  • Мы погружаемся в XML, вплоть до <ArticleIdList> и
  • находим тот <ArticleId>, где атрибут IdType равен заданному значению.
  • Оттуда мы возвращаемtext().

Вы получите то же самое с помощью простого глубокого поиска тоже:

SELECT @xml.value('(//ArticleId[@IdType=sql:variable("@IdToFind")]/text())[1]','int');

Но общий совет таков:возможно.

...