2011-04-19 1 views
2

J'ai un XElement XML comme:LINQ to XML supprimer l'élément où la valeur est nulle

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

Afin de se débarrasser des nœuds Trick où la valeur est nulle, je l'ai écrit:

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

Ce qui fonctionne très bien ... En fait, ça marche beaucoup trop bien, puisque TOUS les noeuds de trick sont supprimés!

Qu'est-ce que je fais de mal? Existe-t-il une façon plus simple de procéder, sans expression lambda?

+0

Je ne l'ai jamais vu 'linq', mais je me demande un peu à ce sujet partie: 'Value =" "'?. Ne devriez-vous pas le comparer à '" "', ne pas le mettre à "" "'? J'essaierais d'utiliser ceci: 'Value ==" "' (Je suis sûr que je me trompe). – Blender

+0

Il n'y a pas de "==" dans Visual Basic, mais peut-être il y a ".Equals" ... Je vais essayer si je n'ai pas de réponse. D'ailleurs, si vous n'avez jamais vu Linq, pourquoi répondre à une question Linq? LOL. Re-outre: Vous devriez essayer, Linq rocks! –

+0

Darn vous Visual Basic! – Blender

Répondre

0

J'ai essayé les différentes solutions, aucune ne fonctionne! On enlève seulement le 1er nœud trouvé, l'autre se bloque lors de l'exécution ...

Enfin, je suis venu avec une simple Visual Basic Linq - NO LAMBDA - solution, comme ceci:

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

qui je l'ai testé et qui fonctionne bien ...

Étrange comment des solutions complexes rendent les programmeurs C# plus heureux !!!

0

Vous devez utiliser l'opérateur == ou la méthode .Equals().

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

ou

myXmlElement.<Play>.<Trick>.Where(Function(m) m.<Trick>.Value.Equals(string.Empty)).Remove() 
2

Est-ce que votre élément XML complet ou une partie de celui-ci? Cela semble faire partie d'un élément plus important puisque je ne pouvais pas reproduire vos résultats avec cette partie seulement.

Si elle fait partie d'un plus grand morceau de XML, utiliser cette approche:

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

Notez que le XML est enveloppé dans <root> noeuds et la référence <Trick> a été omis de la méthode Where.

Si le XML est comme vous l'avez présenté, utilisez cette approche:

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) 

Dans l'exemple ci-dessus, notez que <Play> a été omis car il est la racine de xml, et que <Trick> est également omis de la méthode Where.

0

Pour voir si l'élément est vide, vous pouvez inspecter ses nœuds enfants via la méthode Nodes() pour voir s'il contient quelque chose. Filtrer par les nœuds vides puis les supprimer.

Notez qu'en général, vérifier simplement si la valeur est vide est incorrect car il peut y avoir des éléments enfants vides.

''# assuming we have an XDocument with the above XML 
myXmlDoc.<Play>.<Trick>.Where(Function(e) Not e.Nodes.Any).Remove() 

Voyant que vous vouliez faire en utilisant la notation de requête (qui, par ailleurs ne fait aucune différence):

Dim query = From e In myXmlDoc.<Play>.<Trick> 
      Where Not e.Nodes.Any 
      Select e 
query.Remove()