Linq to XML删除value为null的元素

时间:2011-04-19 16:09:57

标签: .net xml vb.net linq 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表达式?

4 个答案:

答案 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()