我正在尝试解析从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
感谢所有帮助。我希望这足以确定正确的语法
答案 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元素中的每个节点并检索各个位 - 由于这些都是属性,因此@
前缀表示属性,并定义属性的数据类型。
这给了我一个输出:
您可以轻松插入数据库表
更新:如果您还需要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>
个节点