我试图找到一种方法将一个相当大的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
答案 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
返回超出您的需求,但您可以根据自己的需要定制
答案 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的联系功能很棒。坚持这个......