2014-11-25 6 views
0

У меня возникла проблема с анализом XML с SQL2008. Я пробовал этот 100 различных способов и не могу получить никаких данных.Анализ XML с MSSQL 2008

Я пытаюсь получить данные, такие как Title, date_start из XML.

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) 
+0

Примечание: ошибок нет - результаты просто отсутствуют. Благодаря! – user2852137

+0

Что вы ожидаете от вывода? Список вакансий? –

+0

Zoff - В конечном счете, я хочу получить несколько разных полей из XML, но ради этой проблемы я был бы рад получить только один, поэтому я выбрал название. – user2852137

ответ

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"> 
+0

Спасибо, Zoff, это не сработало. Все еще никаких результатов. 0 Вернулись строки. – user2852137

+0

И XML-канал является внешним, предоставляемым третьей стороной, поэтому я не думаю, что могу удалить или объявить переменную там. Благодарю. – user2852137