我想删除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。
答案 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(./@*)]')
我还可以选择所有我忽略/删除的节点。