解析XML文本以标识节点值

时间:2015-08-13 00:08:54

标签: sql sql-server xml

我正在尝试解析从URL获取的XML文件(下面的示例),我需要解析记录节点上的项目。我打算把它放到一个底部有代码的SQL数据库中,但是无法弄清楚那行代码

<pmcids status="ok">
<request idtype="pmid" pmids="" versions="yes" showaiid="no">
<echo>ids=19240239;tool=HCC;email=morgenxxx%40xxxx.edu;format=xml</echo>
</request>
<record requested-id="19240239" pmcid="PMC2668929" pmid="19240239" doi="10.1158/1055-9965.EPI-08-0866">
<versions><version pmcid="PMC2668929.1" mid="NIHMS104698" current="true"/>
</versions>
</record>
</pmcids>

SQL代码:

nref.value('@PMID[1]','varchar(max)') pmid,
            nref.value('@PMCID[1]','varchar(max)') PMCID

感谢所有帮助。我希望这足以确定正确的语法

1 个答案:

答案 0 :(得分:3)

在SQL Server中使用本机XQuery支持!比OPENXML简单得多......

试试这个:

DECLARE @input XML = '<pmcids status="ok">
<request idtype="pmid" pmids="" versions="yes" showaiid="no">
<echo>ids=19240239;tool=HCC;email=morgenxxx%40xxxx.edu;format=xml</echo>
</request>
<record requested-id="19240239" pmcid="PMC2668929" pmid="19240239" doi="10.1158/1055-9965.EPI-08-0866">
   <versions>
       <version pmcid="PMC2668929.1" mid="NIHMS104698" current="true"/>
   </versions>
</record>
</pmcids>'

SELECT
    RequestedId = xc.value('@requested-id', 'int'),
    pmcid = xc.value('@pmcid', 'varchar(50)'),
    pmid = xc.value('@pmid', 'int'),
    doi = xc.value('@doi', 'varchar(50)')
FROM
    @input.nodes('/pmcids/record') AS XT(XC)

基本上,.nodes()调用返回&#34;虚拟&#34;表XT,其中包含列XC,其中包含与您的XPath表达式匹配的每个XML节点的XML片段 - 此处列出<record>根下的所有<pmcids>个节点节点

然后,使用.value()电话,您可以&#34;进入&#34; XML元素中的每个节点并检索各个位 - 由于这些都是属性,因此@前缀表示属性,并定义属性的数据类型。

这给了我一个输出:

enter image description here

您可以轻松插入数据库表

更新:如果您还需要mid节点中的<version> - 请使用此功能:

SELECT
    RequestedId = xc.value('@requested-id', 'int'),
    pmcid = xc.value('@pmcid', 'varchar(50)'),
    pmid = xc.value('@pmid', 'int'),
    doi = xc.value('@doi', 'varchar(50)'),
    VersionPmcid = xver.value('@pmcid', 'varchar(50)'),
    mid = xver.value('@mid', 'varchar(50)')
FROM
    @input.nodes('/pmcids/record') AS XT(XC)
CROSS APPLY
    XC.nodes('versions/version') AS XT2(XVer)

(我在pmcid节点添加了<version>属性,因为此示例的<version>下可能有多个<record>个节点