Linq to XML删除值为空的元素



我有一个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()

相关内容

  • 没有找到相关文章

最新更新