从SQL Server中的XML删除所有空节点

时间:2018-07-31 09:31:27

标签: c# sql sql-server xml xml-parsing

我想删除XML文件中的所有空节点。即使该节点以

出现
<Node/>    OR    <Node></Node>

节点应从XML中删除。

<Root type="1">
<A></A>
<B>
    <B1>
        <B12/>
        <B13/>
    </B1>
    <B2>
        123
        <B21></B21>
    </B2>
   <B3 type="3">
       <B4/>
   </B3>
</B>
<C/>
</Root>

预期输出:

<Root type="1">
<B>
    <B2>
        123
    </B2>
    <B3 type="3">
    </B3>
</B>
</Root>

删除B1节点,因为B1下的所有节点均为空,并且也没有属性。

不要删除B2,因为,B2的值为123,而是删除其空子级。

不要删除B3,因为,B3具有属性,但是要删除其空子级。

我正在使用SQL来做同样的事情,但是如果也可以在c#中完成,我可以从SSIS调用C#脚本,但首选SQL。

3 个答案:

答案 0 :(得分:1)

使用C#的一种方法是:

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

答案 1 :(得分:1)

可以使用正则表达式轻松完成

string xml = @"<Root type=""1"">
                < A ></ A >
                < B >
                    < B1 >
                        < B12 />
                        < B13 />
                    </ B1 >
                    < B2 >
                        123
                        < B21 ></ B21 >
                    </ B2 >
                   < B3 type = ""3"" >

                        < B4 />

                    </ B3 >
                 </ B >
                 < C />
                 </ Root > ";


xml = Regex.Replace(xml, @"<.+?/>", "");
xml = Regex.Replace(xml, @"<(.+?)>\s*</\1>", "");

答案 2 :(得分:0)

在SQL Server中执行此操作的最简单方法。

SET @xml.modify('

delete //*[not(node()) and not(./@*)]

');

SELECT @xml.query('//*[not(node()) and not(./@*)]') 

SET @xml.modify('

delete //*[not(node()) and not(./@*)]

');

SELECT @xml.query('//*[not(node()) and not(./@*)]') 

SET @xml.modify('

delete //*[not(node()) and not(./@*)]

');

SELECT @xml.query('//*[not(node()) and not(./@*)]') 

SET @xml.modify('

delete //*[not(node()) and not(./@*)]

');

SELECT @xml.query('//*[not(node()) and not(./@*)]') 

我还可以选择所有我忽略/删除的节点。