如何从SQL中的XML获取指定的节点

ailinmcc666

我试图从XML数据中获取特定的节点,但我终生无法正常工作。我在变量和表中有以下XML(两者均具有相同的数据):

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <HCNSearchResponse xmlns="http://testurl.com/">
      <HCNSearchResult>
        <HCNLookupResult>
          <MsgID>test1</MsgID>
          <Results>
            <DemographicDetails>
              <Title>Ms</Title>
              <Forename1>F1 test</Forename1>
              <Forename2 />
              <Forename3>F3 test</Forename3>
              <Sex>F</Sex>
              <DateOfBirth>01/01/2000</DateOfBirth>
              <Surname>test1</Surname>
            </DemographicDetails>
            <DemographicDetails>
              <Title>Mr</Title>
              <Forename1>F1 test</Forename1>
              <Forename2 />
              <Forename3></Forename3>
              <Sex>M</Sex>
              <DateOfBirth>01/01/2000</DateOfBirth>
              <Surname>test2</Surname>
            </DemographicDetails>
          </Results>
        </HCNLookupResult>
      </HCNSearchResult>
    </HCNSearchResponse>
  </soap:Body>
</soap:Envelope>

我试图从中提取结果节点,但我无法使其正常工作,我已经尝试了所有这些方法:

    SELECT @XMLResult.query('declare namespace 
    ns="http://testurl.com/";
    /ns:HCNSearchResponse/ns:HCNSearchResult/ns:HCNLookupResult/ns:Results')

    SELECT @XMLResult.query('/HCNSearchResponse/HCNSearchResult/HCNLookupResult/Results')

    SELECT T.N.query('.')
    FROM @XMLResult.nodes('/root/Body/Envelope/HCNSearchResponse/HCNSearchResult/HCNLookupResult/Results') as T(N)

    SELECT x.*, y.c.query('.')
    FROM #xml x
    CROSS APPLY x.resultsXML.nodes('/HCNSearchResponse/HCNSearchResult/HCNLookupResult/Results') y(c)

这些都没有完成!这些语句的select语句仅返回空结果。我有一个名为#XML的表,该表具有一行,其中XML存储在名为“ resultsXML”的列中,而相同的数据存储在名为@XMLResult的变量中。有人可以帮助我吗?

如果有什么不同,这就是我在xml表中填充该列的方式:

INSERT #XML ( resultsXML )
EXEC sp_OAGetProperty @Obj, 'responseXML.XML'
Shnugo

有一个正确的,简单易懂的答案:

您的XML:

DECLARE @XMLResult XML=
N'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <HCNSearchResponse xmlns="http://testurl.com/">
      <HCNSearchResult>
        <HCNLookupResult>
          <MsgID>test1</MsgID>
          <Results>
            <DemographicDetails>
              <Title>Ms</Title>
              <Forename1>F1 test</Forename1>
              <Forename2 />
              <Forename3>F3 test</Forename3>
              <Sex>F</Sex>
              <DateOfBirth>01/01/2000</DateOfBirth>
              <Surname>test1</Surname>
            </DemographicDetails>
            <DemographicDetails>
              <Title>Mr</Title>
              <Forename1>F1 test</Forename1>
              <Forename2 />
              <Forename3></Forename3>
              <Sex>M</Sex>
              <DateOfBirth>01/01/2000</DateOfBirth>
              <Surname>test2</Surname>
            </DemographicDetails>
          </Results>
        </HCNLookupResult>
      </HCNSearchResult>
    </HCNSearchResponse>
  </soap:Body>
</soap:Envelope>';

-正确的答案已经由@bdebaere提供。如果您使用它,请在此处设置接受(但是您当然可以投票;-))。
-但是您可以使用一个名称空间声明来清楚地说明所有这些:
-优点:如果您多次调用XML方法,则必须一遍又一遍地重复声明。

WITH XMLNAMESPACES(DEFAULT 'http://testurl.com/'
                          ,'http://schemas.xmlsoap.org/soap/envelope/' AS [soap])
SELECT @XMLResult.query('/soap:Envelope/soap:Body/HCNSearchResponse/HCNSearchResult/HCNLookupResult/Results');

-轻松奶酪方法使用深度搜索和名称空间通配符
-一般建议是:尽可能具体,但有时懒惰者会赢...

SELECT @XMLResult.query('//*:Results') 

-完整的答案是这样的:

WITH XMLNAMESPACES(DEFAULT 'http://testurl.com/'
                          ,'http://schemas.xmlsoap.org/soap/envelope/' AS [soap])
SELECT dd.value('(Title/text())[1]','nvarchar(max)') AS Title
      ,dd.value('(Forename1/text())[1]','nvarchar(max)') AS Forename1
      ,dd.value('(Forename2/text())[1]','nvarchar(max)') AS Forename2
      ,dd.value('(Forename3/text())[1]','nvarchar(max)') AS Forename3
      ,dd.value('(Sex/text())[1]','nvarchar(1)') AS Sex
      ,dd.value('(DateOfBirth/text())[1]','nvarchar(max)') AS DateOfBirth --Hint: don't use 'datetime' here. Rather pull this data as string and use CONVERT with the appropriate style hint
      ,dd.value('(Surname/text())[1]','nvarchar(max)') AS Surname
FROM @XMLResult.nodes('/soap:Envelope/soap:Body/HCNSearchResponse/HCNSearchResult/HCNLookupResult/Results/DemographicDetails') A(dd);

结果

+-------+-----------+-----------+-----------+-----+-------------+---------+
| Title | Forename1 | Forename2 | Forename3 | Sex | DateOfBirth | Surname |
+-------+-----------+-----------+-----------+-----+-------------+---------+
| Ms    | F1 test   | NULL      | F3 test   | F   | 01/01/2000  | test1   |
+-------+-----------+-----------+-----------+-----+-------------+---------+
| Mr    | F1 test   | NULL      | NULL      | M   | 01/01/2000  | test2   |
+-------+-----------+-----------+-----------+-----+-------------+---------+

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在SQL Server中根据条件获取xml节点

来自分类Dev

如何使用Java获取XML中的节点?

来自分类Dev

在JS中获取具有指定类型的XML节点

来自分类Dev

如何从具有不同节点的XML中获取数据作为SQL Server中的列

来自分类Dev

如何使用sql server在XML文档中获取包含具有给定属性值的子节点的节点?

来自分类Dev

从SQL Server 2005中的列中获取查询的xml节点

来自分类Dev

通过指定限制从xml获取节点

来自分类Dev

如何从 XML 节点获取数据?

来自分类Dev

如何获取字符串中的xml节点值

来自分类Dev

如何在XML中按ID获取节点?

来自分类Dev

如何获取xml中的最后一个节点值

来自分类Dev

如何在pugixml中获取节点的内部XML?

来自分类Dev

如何在Powershell中获取特定的XML节点

来自分类Dev

如何从具有命名空间的XML中获取节点

来自分类Dev

如何通过值获取XML中的节点路径?

来自分类Dev

如何在XML中按ID获取节点?

来自分类Dev

如何在groovy中的特定节点下获取xml

来自分类Dev

如何获取xml中的最后一个节点值

来自分类Dev

如何在 Powershell 中获取 XML 节点属性值?

来自分类Dev

获取xml中的特定节点?

来自分类Dev

SQL Server:如何获取指定属性的XML元素的值?

来自分类Dev

如何从SQL中的ntext列中删除xml节点

来自分类Dev

在SQL中操作XML节点(合并节点)

来自分类Dev

如何在SQL Server中求和XML节点值

来自分类Dev

如何在SQL中从xml节点提取数据

来自分类Dev

如何通过节点类型获取XML :: LibXML中的子节点?

来自分类Dev

在Scala中,如何获取XML节点的文本而不包含其子节点的文本?

来自分类Dev

如何从XML文件中准确获取子节点和该节点中的数据

来自分类Dev

如何从节点列表中的节点获取属性?

Related 相关文章

  1. 1

    如何在SQL Server中根据条件获取xml节点

  2. 2

    如何使用Java获取XML中的节点?

  3. 3

    在JS中获取具有指定类型的XML节点

  4. 4

    如何从具有不同节点的XML中获取数据作为SQL Server中的列

  5. 5

    如何使用sql server在XML文档中获取包含具有给定属性值的子节点的节点?

  6. 6

    从SQL Server 2005中的列中获取查询的xml节点

  7. 7

    通过指定限制从xml获取节点

  8. 8

    如何从 XML 节点获取数据?

  9. 9

    如何获取字符串中的xml节点值

  10. 10

    如何在XML中按ID获取节点?

  11. 11

    如何获取xml中的最后一个节点值

  12. 12

    如何在pugixml中获取节点的内部XML?

  13. 13

    如何在Powershell中获取特定的XML节点

  14. 14

    如何从具有命名空间的XML中获取节点

  15. 15

    如何通过值获取XML中的节点路径?

  16. 16

    如何在XML中按ID获取节点?

  17. 17

    如何在groovy中的特定节点下获取xml

  18. 18

    如何获取xml中的最后一个节点值

  19. 19

    如何在 Powershell 中获取 XML 节点属性值?

  20. 20

    获取xml中的特定节点?

  21. 21

    SQL Server:如何获取指定属性的XML元素的值?

  22. 22

    如何从SQL中的ntext列中删除xml节点

  23. 23

    在SQL中操作XML节点(合并节点)

  24. 24

    如何在SQL Server中求和XML节点值

  25. 25

    如何在SQL中从xml节点提取数据

  26. 26

    如何通过节点类型获取XML :: LibXML中的子节点?

  27. 27

    在Scala中,如何获取XML节点的文本而不包含其子节点的文本?

  28. 28

    如何从XML文件中准确获取子节点和该节点中的数据

  29. 29

    如何从节点列表中的节点获取属性?

热门标签

归档