【问题标题】:Parsing XML with MSSQL 2008使用 MSSQL 2008 解析 XML
【发布时间】:2014-11-25 14:55:31
【问题描述】:

我在使用 SQL2008 解析 XML 时遇到问题。我已经尝试了这 100 种不同的方法,但无法获取任何数据。

我正在尝试从 XML 中获取 Title、date_start 等数据。

XML 将进入我的#xml1 表——我可以从@XMLtable 或#xml1 中进行选择,然后查看列中的 XML。

这是 XML:

<VacancyList xsi:schemaLocation="http://www.somesite.com/list.xsd">
<Vacancy id="1238059" date_start="2014-08-12">
    <Versions>
        <Version language="en">
            <Title>Web Developer  </Title>
            <TitleHeading/>
            <Categories>
                <Item type="area-of-interest" id="32203">SQL</Item>
                <Item type="duration" id="permanent">Permanent</Item>
                <Item type="extent" id="fulltime">Full-time</Item>
                <Item type="operating-time" id="day">Day</Item>
            </Categories>
        </Version>
    </Versions>
    </Vacancy>
    <Vacancy id="1238059" date_start="2014-07-14">
    <Versions>
        <Version language="en">
            <Title>DBA  </Title>
            <TitleHeading/>
            <Categories>
                <Item type="area-of-interest" id="32203">Oracle</Item>
                <Item type="duration" id="permanent">Permanent</Item>
                <Item type="extent" id="fulltime">Full-time</Item>
                <Item type="operating-time" id="day">Day</Item>
            </Categories>
        </Version>
    </Versions>
</Vacancy>
</VacancyList>

这是我的 SQL:

USE tempdb
GO

IF OBJECT_ID('tempdb..#xml1') IS NOT NULL DROP TABLE #xml1
CREATE TABLE #xml1 ( yourXML XML )
GO

DECLARE @URL VARCHAR(8000) 
SELECT @URL = 'https://URLofTheXMLFeed.com/list.xml'

DECLARE @Response varchar(8000)
DECLARE @XML xml
DECLARE @Obj int 
DECLARE @Result int 
DECLARE @HTTPStatus int 
DECLARE @ErrorMsg varchar(MAX)

EXEC @Result = sp_OACreate 'MSXML2.XMLHttp', @Obj OUT 

EXEC @Result = sp_OAMethod @Obj, 'open', NULL, 'GET', @URL, false
EXEC @Result = sp_OAMethod @Obj, 'setRequestHeader', NULL, 'Content-Type', 'application/x-www-form-urlencoded'
EXEC @Result = sp_OAMethod @Obj, send, NULL, ''
EXEC @Result = sp_OAGetProperty @Obj, 'status', @HTTPStatus OUT 

INSERT #xml1 ( yourXML )
EXEC @Result = sp_OAGetProperty @Obj, 'responseXML.xml'--, @Response OUT 

Declare @XMLOutput xml
SET @XMLOutput = (SELECT yourXML FROM #xml1)

SELECT
 val.value('(Title/text())[1]', 'varchar(100)') as Title
FROM
  #xml1
CROSS APPLY yourXML.nodes('//Vacancy') AS Txn(svc)
CROSS APPLY svc.nodes('Versions') AS svc(rsp)
CROSS APPLY rsp.nodes('Version') as rsp(val)

【问题讨论】:

  • 注意:没有错误 - 只是没有结果。谢谢!
  • 您期望输出什么?职位列表?
  • Zoff - 最终我想从 XML 中获取一些不同的字段,但是为了这个问题,我很乐意只得到一个,所以我选择了标题。

标签: sql-server xml sql-server-2008


【解决方案1】:

您的SELECT 语句比它需要的更复杂:

Declare @XMLOutput xml
SET @XMLOutput = (SELECT yourXML FROM #xml1)

SELECT      x.value('Title[1]','varchar(100)')
FROM        @XMLOutput.nodes('/VacancyList/Vacancy/Versions/Version')   t(x)

另外,您的 XML 无效。前缀 xsi 未在 XML 数据中定义。删除或声明它:

<VacancyList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.somesite.com/list.xsd">

【讨论】:

  • 谢谢 Zoff,那没用。仍然没有结果。返回 0 行。
  • XML 提要是外部的,由第 3 方提供,所以我认为我不能在其中删除或声明变量。谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多