2015-04-20 6 views
-2

Моя проблема в том, что я не знаю, как извлечь элемент тега XML с помощью OpenXML. Любые разъяснения были бы замечательными.Извлечение XML с использованием OPENXML()

Я используя xml.node раньше, но теперь я переход на OpenXML

Мой XML документ может быть found here

Моя Хранимая процедура:

ALTER procedure [dbo].[WEEKXml] 
(@xmlstr ntext) 

as 

begin 

    declare @hDoc int 
    exec sp_xml_preparedocument @hDoc OUTPUT,@xmlstr  



    insert into tbl_weekquake 


    select xml.time,xml.longitude,xml.latitude,xml.depth,xml.mag,xml.type,xml.description,xml.text 
    from OPENXML(@hDoc,'/q:quakeml/eventParameters/event',2) 
    with([time] varchar(300) 'times', 
     latitude numeric(18,6), 
     longitude numeric(18,6) , 
     depth varchar(50), 
     mag varchar(50)'magnitude', 
     type varchar(50) 'mag_type', 
     description  varchar(max) 'placer', 
     [text] varchar(50)'type')xml 
     exec sp_xml_removedocument @hDoc 

END 
+0

Какое отношение это имеет отношение к ASP.NET? – mason

+0

@mason Я использовал процедуру хранения asp.net для вставки в db –

+0

Нет такой вещи, как «ASP.NET Хранимая процедура». Хранимые процедуры - это концепция SQL Server, а не концепция веб-платформы. Соответственно, я удалил тег. – mason

ответ

0

Один из ваших вопросов является что OPENXML не обрабатывает «пространство имен по умолчанию» очень хорошо. (кроме того, что никто больше не рекомендует его использование).

Вот как принудительно использовать пространство имен по умолчанию с помощью openxml.

(от http://beyondrelational.com/modules/2/blogs/28/posts/10501/xquery-lab-59-openxml-and-xml-namespace-declarations.aspx)

declare @xmlDoc nvarchar(4000) 
SET @xmlDoc=' 

<q:quakeml xmlns="http://quakeml.org/xmlns/bed/1.2" xmlns:catalog="http://anss.org/xmlns/catalog/0.1" xmlns:q="http://quakeml.org/xmlns/quakeml/1.2"> 
<eventParameters publicID="quakeml:earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.quakeml"> 
<event catalog:datasource="nc" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/earthquakes/feed/v1.0/detail/nc72431490.quakeml"><description><type>earthquake name</type><text>7km W of Cobb, California</text></description><origin catalog:datasource="nc" catalog:dataid="nc72431490" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml"><time><value>2015-04-20T13:08:32.490Z</value></time><longitude><value>-122.810997</value></longitude><latitude><value>38.8321648</value></latitude><depth><value>2340</value><uncertainty>940</uncertainty></depth><originUncertainty><horizontalUncertainty>380</horizontalUncertainty><preferredDescription>horizontal uncertainty</preferredDescription></originUncertainty><quality><usedPhaseCount>9</usedPhaseCount><usedStationCount>9</usedStationCount><standardError>0.02</standardError><azimuthalGap>114</azimuthalGap><minimumDistance>0.008787</minimumDistance></quality><evaluationMode>automatic</evaluationMode><creationInfo><agencyID>NC</agencyID><creationTime>2015-04-20T13:10:09.370Z</creationTime><version>0</version></creationInfo></origin><magnitude catalog:datasource="nc" catalog:dataid="nc72431490" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml#magnitude"><mag><value>0.29</value></mag><type>md</type><stationCount>1</stationCount><originID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml</originID><evaluationMode>automatic</evaluationMode><creationInfo><agencyID>NC</agencyID><creationTime>2015-04-20T13:10:09.370Z</creationTime></creationInfo></magnitude><preferredOriginID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml</preferredOriginID><preferredMagnitudeID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml#magnitude</preferredMagnitudeID><type>earthquake</type><creationInfo><agencyID>nc</agencyID><creationTime>2015-04-20T13:17:04.229Z</creationTime><version>0</version></creationInfo></event> 
<creationInfo><creationTime>2015-04-20T13:31:33.000Z</creationTime></creationInfo> 
</eventParameters></q:quakeml> 


' 


declare @i int 
exec sp_xml_preparedocument @i output, @xmlDoc,'<root xmlns:HaveToUsePlaceholderForDefaultAlias="http://quakeml.org/xmlns/bed/1.2" xmlns:q="http://quakeml.org/xmlns/quakeml/1.2" />' 

SELECT * FROM OPENXML(@i, '/q:quakeml/HaveToUsePlaceholderForDefaultAlias:eventParameters/HaveToUsePlaceholderForDefaultAlias:event',2) 
WITH (
MyDescriptionType  nvarchar(200)   'HaveToUsePlaceholderForDefaultAlias:description[1]/HaveToUsePlaceholderForDefaultAlias:type[1]/.' 
, MyMagValue nvarchar(200) 'HaveToUsePlaceholderForDefaultAlias:magnitude[1]/HaveToUsePlaceholderForDefaultAlias:mag[1]/HaveToUsePlaceholderForDefaultAlias:value[1]/.' 
, MagType nvarchar(200) 'HaveToUsePlaceholderForDefaultAlias:magnitude[1]/HaveToUsePlaceholderForDefaultAlias:type[1]/.' 
) 

exec sp_xml_removedocument @i 

Вы должны пронизывают код с "HaveToUsePlaceholderForDefaultAlias:" повсюду.

Я бы предложил НЕ использовать OPENXML.

Вот «узловая» версия ....... с гораздо более чистым использованием пространства имен по умолчанию.

declare @xmldoc xml 

select @xmldoc = 
' 
<q:quakeml xmlns="http://quakeml.org/xmlns/bed/1.2" xmlns:catalog="http://anss.org/xmlns/catalog/0.1" xmlns:q="http://quakeml.org/xmlns/quakeml/1.2"> 
    <eventParameters publicID="quakeml:earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.quakeml"> 
     <event catalog:datasource="nc" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/earthquakes/feed/v1.0/detail/nc72431490.quakeml"> 
      <description> 
       <type>earthquake name</type> 
       <text>7km W of Cobb, California</text> 
      </description> 
      <origin catalog:datasource="nc" catalog:dataid="nc72431490" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml"> 
       <time> 
        <value>2015-04-20T13:08:32.490Z</value> 
       </time> 
       <longitude> 
        <value>-122.810997</value> 
       </longitude> 
       <latitude> 
        <value>38.8321648</value> 
       </latitude> 
       <depth> 
        <value>2340</value> 
        <uncertainty>940</uncertainty> 
       </depth> 
       <originUncertainty> 
        <horizontalUncertainty>380</horizontalUncertainty> 
        <preferredDescription>horizontal uncertainty</preferredDescription> 
       </originUncertainty> 
       <quality> 
        <usedPhaseCount>9</usedPhaseCount> 
        <usedStationCount>9</usedStationCount> 
        <standardError>0.02</standardError> 
        <azimuthalGap>114</azimuthalGap> 
        <minimumDistance>0.008787</minimumDistance> 
       </quality> 
       <evaluationMode>automatic</evaluationMode> 
       <creationInfo> 
        <agencyID>NC</agencyID> 
        <creationTime>2015-04-20T13:10:09.370Z</creationTime> 
        <version>0</version> 
       </creationInfo> 
      </origin> 
      <magnitude catalog:datasource="nc" catalog:dataid="nc72431490" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml#magnitude"> 
       <mag> 
        <value>0.29</value> 
       </mag> 
       <type>md</type> 
       <stationCount>1</stationCount> 
       <originID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml</originID> 
       <evaluationMode>automatic</evaluationMode> 
       <creationInfo> 
        <agencyID>NC</agencyID> 
        <creationTime>2015-04-20T13:10:09.370Z</creationTime> 
       </creationInfo> 
      </magnitude> 
      <preferredOriginID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml</preferredOriginID> 
      <preferredMagnitudeID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml#magnitude</preferredMagnitudeID> 
      <type>earthquake</type> 
      <creationInfo> 
       <agencyID>nc</agencyID> 
       <creationTime>2015-04-20T13:17:04.229Z</creationTime> 
       <version>0</version> 
      </creationInfo> 
     </event> 
     <creationInfo> 
      <creationTime>2015-04-20T13:31:33.000Z</creationTime> 
     </creationInfo> 
    </eventParameters> 
</q:quakeml> 

' 



;WITH XMLNAMESPACES ('http://quakeml.org/xmlns/quakeml/1.2' AS q, DEFAULT 'http://quakeml.org/xmlns/bed/1.2') 
SELECT 
    MyDescriptionType = Y.i.value('./description[1]/type[1]/.', 'varchar(64)') 
, MyMagValue = Y.i.value('./magnitude[1]/mag[1]/value[1]/.', 'varchar(64)') 
, MagType = Y.i.value('./magnitude[1]/type[1]/.', 'varchar(64)') 


FROM 
    @xmldoc.nodes('/q:quakeml/eventParameters/event') AS Y(i) 

APPEND:

Вы можете поместить данные в таблице #temp, а затем вставить данные из таблицы #temp в «реальную» таблицу.

IF OBJECT_ID('tempdb..#Holder') IS NOT NULL 
begin 
    drop table #Holder 
end 


CREATE TABLE #Holder (ID int identity (1000,1) , MyDescription varchar(64) , Longitude numeric(18,6) , Magnitude varchar(64) , MagType varchar(64)) 


declare @xmldoc xml 

select @xmldoc = 
' 
<q:quakeml xmlns="http://quakeml.org/xmlns/bed/1.2" xmlns:catalog="http://anss.org/xmlns/catalog/0.1" xmlns:q="http://quakeml.org/xmlns/quakeml/1.2"> 
    <eventParameters publicID="quakeml:earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.quakeml"> 
     <event catalog:datasource="nc" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/earthquakes/feed/v1.0/detail/nc72431490.quakeml"> 
      <description> 
       <type>earthquake name</type> 
       <text>7km W of Cobb, California</text> 
      </description> 
      <origin catalog:datasource="nc" catalog:dataid="nc72431490" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml"> 
       <time> 
        <value>2015-04-20T13:08:32.490Z</value> 
       </time> 
       <longitude> 
        <value>-122.810997</value> 
       </longitude> 
       <latitude> 
        <value>38.8321648</value> 
       </latitude> 
       <depth> 
        <value>2340</value> 
        <uncertainty>940</uncertainty> 
       </depth> 
       <originUncertainty> 
        <horizontalUncertainty>380</horizontalUncertainty> 
        <preferredDescription>horizontal uncertainty</preferredDescription> 
       </originUncertainty> 
       <quality> 
        <usedPhaseCount>9</usedPhaseCount> 
        <usedStationCount>9</usedStationCount> 
        <standardError>0.02</standardError> 
        <azimuthalGap>114</azimuthalGap> 
        <minimumDistance>0.008787</minimumDistance> 
       </quality> 
       <evaluationMode>automatic</evaluationMode> 
       <creationInfo> 
        <agencyID>NC</agencyID> 
        <creationTime>2015-04-20T13:10:09.370Z</creationTime> 
        <version>0</version> 
       </creationInfo> 
      </origin> 
      <magnitude catalog:datasource="nc" catalog:dataid="nc72431490" catalog:eventsource="nc" catalog:eventid="72431490" publicID="quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml#magnitude"> 
       <mag> 
        <value>0.29</value> 
       </mag> 
       <type>md</type> 
       <stationCount>1</stationCount> 
       <originID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml</originID> 
       <evaluationMode>automatic</evaluationMode> 
       <creationInfo> 
        <agencyID>NC</agencyID> 
        <creationTime>2015-04-20T13:10:09.370Z</creationTime> 
       </creationInfo> 
      </magnitude> 
      <preferredOriginID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml</preferredOriginID> 
      <preferredMagnitudeID>quakeml:earthquake.usgs.gov/realtime/product/origin/nc72431490/nc/1429535409370/product.xml#magnitude</preferredMagnitudeID> 
      <type>earthquake</type> 
      <creationInfo> 
       <agencyID>nc</agencyID> 
       <creationTime>2015-04-20T13:17:04.229Z</creationTime> 
       <version>0</version> 
      </creationInfo> 
     </event> 
     <creationInfo> 
      <creationTime>2015-04-20T13:31:33.000Z</creationTime> 
     </creationInfo> 
    </eventParameters> 
</q:quakeml> 

' 


;WITH XMLNAMESPACES ('http://quakeml.org/xmlns/quakeml/1.2' AS q, DEFAULT 'http://quakeml.org/xmlns/bed/1.2') 

INSERT INTO #HOLDER (MyDescription , Longitude , Magnitude , MagType ) 

SELECT 
    MyDescriptionType = Y.i.value('./description[1]/type[1]/.', 'varchar(64)') 
, MyLongitude = Y.i.value('./origin[1]/longitude[1]/.', 'numeric(18,6)') 
, MyMagValue = Y.i.value('./magnitude[1]/mag[1]/value[1]/.', 'varchar(64)') 
, MagType = Y.i.value('./magnitude[1]/type[1]/.', 'varchar(64)') 


FROM 
    @xmldoc.nodes('/q:quakeml/eventParameters/event') AS Y(i) 








/* Optional */ 
/* CREATE CLUSTERED INDEX IDX_TempHolder_ID ON #Holder (ID) */ 
CREATE INDEX IDX_TempHolder_ID ON #Holder (ID) 

/* HERE you go from #temp table to real table */ 
Insert into dbo.RealTable (Description , Longitude , Magnitude , MagType ) 
select MyDescription , Longitude , Magnitude , MagType from #Holder 







IF OBJECT_ID('tempdb..#Holder') IS NOT NULL 
begin 
    drop table #Holder 
end 
+0

Я использовал узел раньше, но когда мне нужно вставить 1000 записей из xml-файла, потребуется 15 минут, чтобы загрузить его в базу данных. Считаете ли вы, что есть другой метод? –

+0

Вместо того, чтобы идти прямо из xml в (реальную) таблицу, создайте #tempTable или @ variableTable .... запишите, что #tempTable или @ variableTable ... и hten вставьте в реальную таблицу оттуда. Вы хотите отделить обработку для xml-shredding ... от INSERT. Я не говорю, что это сработает ... с чем-то экспериментировать. И эксперимент между #tempTable, а также переменной @ variableTable. – granadaCoder

+0

По-прежнему требуется время, но гораздо быстрее. теперь проблема заключается в том, когда я пытаюсь сделать очень большой xml-файл размером 18 мегабайт. Я получаю веб-страницу недоступной (ERR_CONNECTION_RESET) –

Смежные вопросы