使用sql server获取子元素值

时间:2014-01-10 11:16:08

标签: xml sql-server-2008

从以下代码中如何只获取子元素值一次。即 当我从root->解析父 - >孩子 - >我需要为子元素标记循环以获取所有子元素值,然后解析为父元素的结尾和根元素的结尾。我不想去下一个父母 - >下一个孩子。

<root>
   <parent> 
        <name>g</name>
        <child>child1</child>
        <child>child2</child>
        <child>child3</child>
     </parent>

   <parent> 
        <name>s</name>
        <age>23</age>
        <child>child1</child>
        <child>child2</child>
        <child>child3</child>
     </parent>


   <parent> 
        <name>t</name>
        <child>child1</child>
        <child>child2</child>
        <child>child3</child>
     </parent>

在这里,我只需要获取子元素值一次而不解析整个文件。当我写xml文件时,我知道所有父节点的这些元素值是相同的。在这种情况下,如何从上面的文件中获取child1,child2,child3。

1 个答案:

答案 0 :(得分:0)

试试这个:

DECLARE @XML XML = '<root>
   <parent> 
        <name>g</name>
        <child>child1</child>
        <child>child2</child>
        <child>child3</child>
     </parent>

   <parent> 
        <name>s</name>
        <age>23</age>
        <child>child1</child>
        <child>child2</child>
        <child>child3</child>
     </parent>


   <parent> 
        <name>t</name>
        <child>child1</child>
        <child>child2</child>
        <child>child3</child>
     </parent>
</root>'

SELECT
    ChildNodeName = XC.value('(.)[1]', 'varchar(50)'),
    ParentName = XC.value('(../name)[1]', 'varchar(50)')
FROM 
@XML.nodes('/root/parent/child') AS XT(XC)     

基本上,使用<child>获取所有.nodes()节点的列表,然后迭代这些子节点 - 输出您需要的内容。要访问每个<child>节点的“父”节点,请使用../name XPath表达式。

更新:如果您只想要不同的子数据 - 请使用此查询:

SELECT
    DISTINCT ChildNodeName = XC.value('(.)[1]', 'varchar(50)')
FROM 
    @XML.nodes('/root/parent/child') AS XT(XC)