在SQL中将XML解析为表(仅包含值的节点)

时间:2016-10-21 17:09:09

标签: sql sql-server xml xml-parsing xquery

我试图找到一种方法将一个相当大的XML文件解析成一个表格,该表格只显示节点的名称及其值。 XML中没有可担心的属性,但有几个嵌套节点。

因为XML是动态生成的,所以无法知道嵌套的确切深度。但是可以安全地假设任何分支的最后一个孩子都包含数据。

这是我尝试解决方案,但问题是当访问父节点时,来自每个子节点的数据会被连接为值。

DECLARE @ProjectXML XML
SET @ProjectXML = '
<Project>

  <ProjectId>1</ProjectId>
  <OrganizationId>1</OrganizationId>
  <Title>This is a Test Title</Title>
  <Description>This is a Test Description</Description>
  <ProjectType>
    <Id>1</Id>
    <Name>Test Name</Name>
    <Outer>
        <Inner1>Hi</Inner1>
        <Inner2>There</Inner2>
    </Outer>
  </ProjectType>
</Project>
'
SELECT
n.value('local-name(.)','VARCHAR(100)') AS Name,  
n.value('.','VARCHAR(MAX)') AS Value

FROM @ProjectXML.nodes('//*') AS ProjectXML(n) 

结果是:

Project           11This is a Test TitleThis is a Test Description1Test NameHiThere
ProjectId         1
OrganizationId    1
Title             This is a Test Title
Description       This is a Test Description
ProjectType       1Test NameHiThere
Id                1
Name              Test Name
Outer             HiThere
Inner1            Hi
Inner2            There

有没有办法(使用xquery?)忽略不包含数据的父节点,只返回子节点的值呢?

**如果可以将每个结果的名称作为其父节点的格式化列表返回,则奖励积分,例如:

Project - ProjectId                         1
Project - OrganizationId                    1
Project - Title                             This is a Test Title
Project - Description                       This is a Test Description
Project - Project Type - Id                 1
Project - Project Type - Name               Test Name
Project - Project Type - Outer - Inner1     Hi
Project - Project Type - Outer - Inner2     There

2 个答案:

答案 0 :(得分:1)

查看http://beyondrelational.com/modules/2/blogs/28/posts/10495/xquery-lab-58-select-from-xml.aspx

Select * from XMLTable(@ProjectXML) where value is not null

返回超出您的需求,但您可以根据自己的需要定制

enter image description here

答案 1 :(得分:1)

这可以更轻松地完成......

如果没有/text(),获取节点的/text()有点棘手。但是有empty() - 函数和not() - 函数:

SELECT
n.value('local-name(.)','VARCHAR(100)') AS Name,  
n.value('.','VARCHAR(MAX)') AS Value
FROM @ProjectXML.nodes('//*[not(empty(text()))]') AS ProjectXML(n) 

你可以read this

带有FROM OPENXML的旧WHERE text IS NOT NULL会提供相同的内容以及有关XML中位置的更多详细信息。

但John Capelletti的联系功能很棒。坚持这个......