2011-04-19 56 views
2

我有一个像XML的XElement删除元素:的LINQ to XML,其中值为null

<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天雷节点,我写道:

myXmlElement.<Play>.<Trick>.Where(Function(m) m.<Trick>.Value = "").Remove() 

其中工作得很好... 其实它工作得太好了,因为所有的技巧节点都被删除了!

我该怎么做? 有没有更简单的方法来进行,没有lambda表达式?

+0

我从来没有见过'linq',但我有点怀疑这个部分:'Value =“”'?你不应该将它与''“'比较吗,不是将它设置为'”“'?我会尝试使用这个:'Value ==“”'(我很确定我错了)。 – Blender 2011-04-19 16:12:51

+0

在Visual Basic中没有“==”,但也许有“.Equals”...如果没有答案,我会给它一个。此外,如果你从未见过Linq,为什么回答Linq问题?大声笑。除此之外:你应该放弃它,Linq岩石! – 2011-04-19 16:15:38

+0

为您提供Visual Basic! – Blender 2011-04-19 16:17:01

回答

0

我已经尝试过各种解决方案,但它们都不起作用!一个只删除第一个发现的节点,在运行时另一个崩溃......

最后,我想出了一个简单的Visual Basic中的LINQ - NO LAMBDA - 解决方案,如:

Dim xTricks = From x In myXmlElement.<Play>.<Trick> Where x.Value = "" Select x 
xTricks.Remove() 

这我测试并且工作正常...

奇怪的复杂解决方案如何让c#程序员感到幸福!

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

那是你的完整的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) 

在上面的例子中,注意的是,由于它是xml根,和<Trick>也从省略<Play>已被省略方法Where

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