我有一个XML xElement:
<Play>
<Trick Lead="E" Win="S" TNum="1">S3.S2.S4.SA></Trick>
<Trick Lead="S" Win="N" TNum="2">DK.DA.D6.DQ></Trick>
..../...
<Trick Lead="" Win="" TNum="7"></Trick>
.../...
<Trick Lead="" Win="" TNum="13"></Trick>
</Play>
为了摆脱值为null的Trick节点,我写道:
myXmlElement.<Play>.<Trick>.Where(Function(m) m.<Trick>.Value = "").Remove()
效果很好…实际上它工作得太好了,因为所有的技巧节点都被删除了!
我做错了什么?有没有更简单的方法来继续,没有lambda表达式?
这是完整的XML元素还是它的一部分?这似乎是一个更大元素的一部分,因为我无法用那一部分重现你的结果。
如果它是较大的XML片段的一部分,则使用以下方法:
Dim xml = <root><Play>
<Trick Lead="E" Win="S" TNum="1">S3.S2.S4.SA></Trick>
<Trick Lead="S" Win="N" TNum="2">DK.DA.D6.DQ></Trick>
<Trick Lead="" Win="" TNum="7"></Trick>
<Trick Lead="" Win="" TNum="13"></Trick>
</Play></root>
xml.<Play>.<Trick>.Where(Function(m) m.Value = "").Remove()
注意,XML被包装在<root>
节点中,<Trick>
引用在Where
方法中被省略了。
如果XML如您所示,则使用以下方法:
Dim xml = <Play>
<Trick Lead="E" Win="S" TNum="1">S3.S2.S4.SA></Trick>
<Trick Lead="S" Win="N" TNum="2">DK.DA.D6.DQ></Trick>
<Trick Lead="" Win="" TNum="7"></Trick>
<Trick Lead="" Win="" TNum="13"></Trick>
</Play>
xml.<Trick>.Where(Function(m) m.Value = "").Remove()
Console.WriteLine(xml)
在上面的示例中,注意<Play>
被省略了,因为它是xml
的根,并且<Trick>
也从Where
方法中省略了。
我尝试了各种解决方案,没有一个有效!一个只删除第一个找到的节点,另一个在运行时崩溃…
最后我想出了一个更简单的Visual Basic Linq - NO LAMBDA -解决方案,如下所示:
Dim xTricks = From x In myXmlElement.<Play>.<Trick> Where x.Value = "" Select x
xTricks.Remove()
我测试过了,效果很好…
奇怪复杂的解决方案如何让c#程序员感到更快乐!!
应该使用==运算符或。equals()方法。
myXmlElement.<Play>.<Trick>.Where(Function(m) m.<Trick>.Value == "").Remove()
或
myXmlElement.<Play>.<Trick>.Where(Function(m) m.<Trick>.Value.Equals(string.Empty)).Remove()
要查看元素是否为空,可以通过Nodes()
方法检查它的子节点,看看它是否有任何内容。筛选空节点,然后删除它们。
注意,一般来说,仅仅检查值是否为空是错误的,因为可能存在空的子元素。
''# assuming we have an XDocument with the above XML
myXmlDoc.<Play>.<Trick>.Where(Function(e) Not e.Nodes.Any).Remove()
考虑到你想使用查询符号(顺便说一下,这没有什么区别):
Dim query = From e In myXmlDoc.<Play>.<Trick>
Where Not e.Nodes.Any
Select e
query.Remove()