XPATH选择不同的值ID和标志

时间:2017-03-22 02:47:24

标签: sql-server xml xpath xquery

我对XML&编写XPath查询。

如何通过xpath选择id和flag节点?

我想获取包含或具有id的所有节点,以将其包含在sql列中。

知道如何获得这个吗?

<Hoteles>
    <Hotel>
        <Orden>1</Orden>
        <DiasDesdeInicio>0</DiasDesdeInicio>
        <Noches>1</Noches>
        <ID>14993</ID>
        <Nombre>1XX</Nombre>
        <Ciudad>
            <ID>TUC</ID>
            <Nombre>D</Nombre>
        </Ciudad>
        <Categoria>*****</Categoria>
        <Cupo>
            <Flag>1</Flag>
        </Cupo>
    </Hotel>
    <Hotel>
        <Orden>2</Orden>
        <DiasDesdeInicio>1</DiasDesdeInicio>
        <Noches>1</Noches>
        <ID>8503</ID>
        <Nombre>2XXX</Nombre>
        <Ciudad>
            <ID>CAF</ID>
            <Nombre>C</Nombre>
        </Ciudad>
        <Categoria>***</Categoria>
        <Cupo>
            <Flag>0</Flag>
        </Cupo>
    </Hotel>
    <Hotel>
        <Orden>3</Orden>
        <DiasDesdeInicio>2</DiasDesdeInicio>
        <Noches>4</Noches>
        <ID>11424</ID>
        <Nombre>3XXX</Nombre>
        <Ciudad>
            <ID>SLA</ID>
            <Nombre>S</Nombre>
        </Ciudad>
        <Categoria>****</Categoria>
        <Cupo>
            <Flag>1</Flag>
        </Cupo>
    </Hotel>
</Hoteles>

我正在使用SQL 2008 -thanks

2 个答案:

答案 0 :(得分:1)

 Declare @HotelXml xml
 Select @HotelXml = '<Hoteles>
 <Hotel>
   <Orden>1</Orden>
   <DiasDesdeInicio>0</DiasDesdeInicio>
   <Noches>1</Noches>
   <ID>14993</ID>
   <Nombre>1XX</Nombre>
   <Ciudad>
      <ID>TUC</ID>
      <Nombre>D</Nombre>
   </Ciudad>
   <Categoria>*****</Categoria>
   <Cupo>
      <Flag>1</Flag>
   </Cupo>
   </Hotel>
   <Hotel>
      <Orden>2</Orden>
      <DiasDesdeInicio>1</DiasDesdeInicio>
      <Noches>1</Noches>
      <ID>8503</ID>
      <Nombre>2XXX</Nombre>
      <Ciudad>
         <ID>CAF</ID>
         <Nombre>C</Nombre>
      </Ciudad>
      <Categoria>***</Categoria>
      <Cupo>
         <Flag>0</Flag>
      </Cupo>
    </Hotel>
    <Hotel>
      <Orden>3</Orden>
      <DiasDesdeInicio>2</DiasDesdeInicio>
      <Noches>4</Noches>
      <ID>11424</ID>
      <Nombre>3XXX</Nombre>
      <Ciudad>
         <ID>SLA</ID>
         <Nombre>S</Nombre>
      </Ciudad>
      <Categoria>****</Categoria>
      <Cupo>
        <Flag>1</Flag>
      </Cupo>
    </Hotel>
</Hoteles>'

 declare @XmlOutPut int

 Begin Transaction

  exec sp_xml_preparedocument @XmlOutPut output, @HotelXml 


   select newXML.ID from 
    OPENXML(@XmlOutPut,'/Hoteles/Hotel',3) with (ID int) newXML

   --IF @@ERROR <> 0 BEGIN ROLLBACK RETURN 0 END

   --select 1

 Commit

 exec sp_xml_removedocument @XmlOutPut

这是输出

Result

如果要选择带节点的ID,则可以执行以下操作 -

SELECT T.c.query('.') AS result  
from @HotelXml.nodes('/Hoteles/Hotel/ID') T(c)

如果你需要别的东西,请告诉我。

由于

答案 1 :(得分:1)

你的问题很不清楚......

  

我想获取包含或具有id的所有节点,以将其包含在sql列中。

???

以下代码演示了如何从XML中检索数据的一些方法。如果这不能解决您的问题,请阅读How to ask a good SQL questionHow to create a MCVE

DECLARE @xml XML=
N'<Hoteles>
    <Hotel>
        <Orden>1</Orden>
        <DiasDesdeInicio>0</DiasDesdeInicio>
        <Noches>1</Noches>
        <ID>14993</ID>
        <Nombre>1XX</Nombre>
        <Ciudad>
            <ID>TUC</ID>
            <Nombre>D</Nombre>
        </Ciudad>
        <Categoria>*****</Categoria>
        <Cupo>
            <Flag>1</Flag>
        </Cupo>
    </Hotel>
    <Hotel>
        <Orden>2</Orden>
        <DiasDesdeInicio>1</DiasDesdeInicio>
        <Noches>1</Noches>
        <ID>8503</ID>
        <Nombre>2XXX</Nombre>
        <Ciudad>
            <ID>CAF</ID>
            <Nombre>C</Nombre>
        </Ciudad>
        <Categoria>***</Categoria>
        <Cupo>
            <Flag>0</Flag>
        </Cupo>
    </Hotel>
    <Hotel>
        <Orden>3</Orden>
        <DiasDesdeInicio>2</DiasDesdeInicio>
        <Noches>4</Noches>
        <ID>11424</ID>
        <Nombre>3XXX</Nombre>
        <Ciudad>
            <ID>SLA</ID>
            <Nombre>S</Nombre>
        </Ciudad>
        <Categoria>****</Categoria>
        <Cupo>
            <Flag>1</Flag>
        </Cupo>
    </Hotel>
</Hoteles>';

--I want to get all nodes that contain or having id , to include it in a sql column.

选择具有给定ID的酒店

DECLARE @id INT=8503;
SELECT @xml.query(N'/Hoteles/Hotel[ID=sql:variable("@id")]')

返回完整节点

<Hotel>
  <Orden>2</Orden>
  <DiasDesdeInicio>1</DiasDesdeInicio>
  <Noches>1</Noches>
  <ID>8503</ID>
  <Nombre>2XXX</Nombre>
  <Ciudad>
    <ID>CAF</ID>
    <Nombre>C</Nombre>
  </Ciudad>
  <Categoria>***</Categoria>
  <Cupo>
    <Flag>0</Flag>
  </Cupo>
</Hotel>

返回所有ID

SELECT id.value(N'(./text())[1]','int') AS ID
FROM @xml.nodes(N'/Hoteles/Hotel/ID') AS A(id) 

结果是ID列表

14993
8503
11424

返回派生表

SELECT The.hotel.value(N'(ID)[1]','int') AS ID
      ,The.hotel.value(N'(DiasDesdeInicio)[1]','int') AS DiasDesdeInicio
      ,The.hotel.value(N'(Noches)[1]','int') AS Noches
      ,The.hotel.value(N'(Ciudad/ID)[1]','nvarchar(max)') AS Ciudad_ID 
      --more elements
      ,The.hotel.value(N'(Ciudad/Nombre)[1]','nvarchar(max)') AS Ciudad_ID 
      --more elements
FROM @xml.nodes(N'/Hoteles/Hotel') AS The(hotel)

返回一个表

+-------+-----------------+--------+-----------+-----------+
| ID    | DiasDesdeInicio | Noches | Ciudad_ID | Ciudad_ID |
+-------+-----------------+--------+-----------+-----------+
| 14993 | 0               | 1      | TUC       | D         |
+-------+-----------------+--------+-----------+-----------+
| 8503  | 1               | 1      | CAF       | C         |
+-------+-----------------+--------+-----------+-----------+
| 11424 | 2               | 4      | SLA       | S         |
+-------+-----------------+--------+-----------+-----------+