我有一个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表达式?
答案 0 :(得分:2)
这是您的完整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
。< / p>
答案 1 :(得分:0)
您应该使用==运算符或.Equals()方法。
myXmlElement.<Play>.<Trick>.Where(Function(m) m.<Trick>.Value == "").Remove()
或
myXmlElement.<Play>.<Trick>.Where(Function(m) m.<Trick>.Value.Equals(string.Empty)).Remove()
答案 2 :(得分:0)
我尝试了各种解决方案,但没有一个有效!一个只删除第一个找到的节点,另一个在运行时崩溃...
最后,我提出了一个更简单的Visual Basic Linq - NO LAMBDA - 解决方案,如下所示:
Dim xTricks = From x In myXmlElement.<Play>.<Trick> Where x.Value = "" Select x
xTricks.Remove()
我测试了哪个,哪个工作正常......
奇怪的是,复杂的解决方案使c#程序员感到开心!!!“
答案 3 :(得分:0)
要查看元素是否为空,可以通过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()