从xml获取记录集,如html

时间:2016-11-03 21:39:20

标签: sql sql-server xml tsql xpath

Microsoft SQL Server。我有一个xml:

<script type="text/javascript">
    window.setTimeout(function(){ document.location.reload(true); }, 30000);
</script>

我应该使用什么样的select方法来提取行中的结果获取值,例如: <div class="list"> <ul> <li class="nr">5859. </li> <li class="task">task</li> <li class="var">Norman</li> <li class="var">Dave</li> </ul>

1 个答案:

答案 0 :(得分:1)

你说:我有一个xml:

否!你还没有!你有HTML!

许多人认为,它们是相同的,至少它们看起来如此相似,但HTML 不是 XML。在您的示例中,缺少结束<div> - 标记将破坏任何基于XML的方法...

仅使用列表定义,您可以使用XML方法:

DECLARE @Xml XMl=
 '<ul>
    <li class="nr">5859. </li>
    <li class="task">task</li>
    <li class="var">Norman</li>
    <li class="var">Dave</li>
</ul>' 

SELECT li.value('@class','nvarchar(max)') AS NodeClass
      ,li.value('.','nvarchar(max)') AS NodeValue
FROM @xml.nodes('/ul/li') AS A(li)

但我真的强烈建议不要用SQL-Server解析HTML ......

如果你可以确定,那么给定的HTML 是XHTML ,就会有所不同。 XHTML是HTML,严格遵守XML标准。在这种情况下,只有在这种情况下,这是一个很好的方法......

更新:阅读评论

中给出的XML

两个问题:

  1. 获取所有<li>元素(如果计数和命名可能不同)
  2. 并行获取值 (如果结构已修复)
  3. 试试这个

    DECLARE @xml XML=
    N'<div class="list">
      <ul>
        <li class="nr">5859. </li>
        <li class="task">task</li>
        <li class="var">Norman</li>
        <li class="var">Dave</li>
      </ul>
    </div>';
    
    SELECT li.value('@class','nvarchar(max)') AS NodeClass
          ,li.value('.','nvarchar(max)') AS NodeValue
    FROM @xml.nodes('/div/ul/li') AS A(li)
    
    
    SELECT ul.value('(li[@class="nr"])[1]','nvarchar(max)') AS nr
          ,ul.value('(li[@class="task"])[1]','nvarchar(max)') AS task
          ,ul.value('(li[@class="var"])[1]','nvarchar(max)') AS var1
          ,ul.value('(li[@class="var"])[2]','nvarchar(max)') AS var2
    FROM @xml.nodes('/div/ul') AS A(ul)