为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
12345678_0001 2021-11-07 20:24:31
我想删除 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 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

在 C# 中的一种方法是:


var x = XElement.Parse(@"<Root type=""1"">

                            <A></A>

                            <B>

                                <B1>

                                    <B12/>

                                    <B13/>

                                </B1>

                                <B2>

                                    123

                                    <B21></B21>

                                </B2>

                               <B3 type=""3"">

                                   <B4/>

                               </B3>

                            </B>

                            <C/>

                            </Root>");


foreach(XElement child in x.Descendants().Reverse())

{

    if(!child.HasElements && string.IsNullOrEmpty(child.Value) && !child.HasAttributes) 

        child.Remove();

}


查看完整回答
反对 回复 2021-11-07
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

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


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>", "");


查看完整回答
反对 回复 2021-11-07
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

在 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(./@*)]') 

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


查看完整回答
反对 回复 2021-11-07
  • 3 回答
  • 0 关注
  • 358 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信