【问题标题】:Parse XML with multilevel nesting in SQL在 SQL 中使用多级嵌套解析 XML
【发布时间】:2015-03-17 20:46:37
【问题描述】:

我正在尝试解析一些在 SQL 中具有多个嵌套级别的 XML。我在这里遇到的问题是如何编写足够通用的查询来解析下面的 XML,而不必对节点路径进行硬编码,例如:g

EXEC sp_xml_preparedocument @handle OUTPUT, @xml

INSERT #Root(ID)
SELECT *
FROM OPENXML(@handle, '/Root')
WITH (ID VARCHAR(100))

INSERT #ConditionSet(Operator)
SELECT *
FROM OPENXML(@handle, '/Root/ConditionSet')
WITH (Operator VARCHAR(100))

INSERT #ConditionSet(Operator)
SELECT *
FROM OPENXML(@handle, '/Root/ConditionSet/ConditionSet')
WITH (Operator VARCHAR(100))

INSERT #ConditionSet(Operator)
SELECT *
FROM OPENXML(@handle, '/Root/ConditionSet/ConditionSet/ConditionSet')
WITH (Operator VARCHAR(100))

有没有更好的方法来用 SQL 解析以下 XML 并以表格形式表示所有数据?

<?xml version="1.0"?>
-<Root ID="414141" Source="AudienceBuilder">
  -<ConditionSet Operator="I">
    -<Condition Operator="E" ID="74373">
      -<Relationship ID="56756">
        <Relationship ID="67868"/>
      </Relationship>
      -<Value>
        <![CDATA[ABC]]>
      </Value>
    </Condition>
    -<ConditionSet Operator="O">
      -<Condition Operator="E" ID="6566">
        -<Relationship ID="7658">
          <Relationship ID="6547"/>
        </Relationship>
        -<Value>
          <![CDATA[DEF]]>
        </Value>
      </Condition>
      -<Condition Operator="E" ID="96967">
        -<Relationship ID="3884">
          <Relationship ID="9954"/>
        </Relationship>
        -<Value>
          <![CDATA[GHI]]>
        </Value>
      </Condition>
      -<ConditionSet Operator="A">
        -<Condition Operator="E" ID="31654">
          -<Relationship ID="57894">
            <Relationship ID="8532"/>
          </Relationship>
          -<Value>
            <![CDATA[JKL]]>
          </Value>
        </Condition>
        -<Condition Operator="E" ID="65636">
          -<Relationship ID="843">
            <Relationship ID="7473"/>
          </Relationship>
          -<Value>
            <![CDATA[MNO]]>
          </Value>
        </Condition>
      </ConditionSet>
    </ConditionSet>
  </ConditionSet>
</Root>

任何意见/建议都非常感谢:)

谢谢

热心

【问题讨论】:

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


    【解决方案1】:

    假设您将 XML 保存在名为 @XML 的 SQL Server 变量中,您可以使用 SQL Server 2005 及更新版本中的原生 XQuery 支持来更优雅、更高效地执行此操作:

    DECLARE @XML XML = '...(your XML here).....' 
    
    SELECT
        RootID = @xml.value('(/Root/@ID)[1]', 'int'),
        ConditionSetOperator = XC.value('@Operator', 'varchar(50)'),
        ConditionID =  XC2.value('@ID', 'int'),
        ConditionOperator = XC2.value('@Operator', 'varchar(50)')
    FROM 
        @Xml.nodes('//ConditionSet') AS XT(XC)
    CROSS APPLY
        xc.nodes('Condition') AS XT2(XC2)
    

    这给了我一个输出

    使用像.nodes().value() 这样的XQuery 运算符,您可以轻松地将XML 文档“分解”成关系数据并根据需要进行存储。

    第一次调用@xml.nodes('//ConditionSet') 将为每个匹配节点获得一个“伪”表 - 因此每个&lt;ConditionSet&gt; 节点将在“伪”表XT 中作为列XC 返回,然后我可以使用 .value() 等 XQuery 方法轻松地从该 XML 片段中获取属性(或 XML 元素)。

    或者我什至可以获取每个 &lt;ConditionSet&gt; 节点的子节点列表 &lt;Condition&gt; - 使用 CROSS APPLY 并再次调用 .nodes()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多