Linq to XML удалить элемент, где значение равно нулю - PullRequest
2 голосов
/ 19 апреля 2011

У меня есть 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> 

Чтобы избавиться от узлов Trick, где значение равно нулю , я написал:

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

Который работает очень хорошо ... На самом деле он работает слишком хорошо, так как ВСЕ узлы хитрости удалены!

Что я делаю не так?Есть ли более простой способ продолжить, без лямбда-выражения?

Ответы [ 4 ]

2 голосов
/ 19 апреля 2011

Это ваш полный элемент 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.

0 голосов
/ 20 апреля 2011

Чтобы увидеть, является ли элемент пустым, вы можете проверить его дочерние узлы с помощью метода 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()
0 голосов
/ 20 апреля 2011

Я пробовал различные решения, ни одно из них не работает! Один удаляет только 1-й найденный узел, другой сбой во время выполнения ...

Наконец, я придумал более простое решение для Visual Basic Linq - NO LAMBDA, например:

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

Который я проверял и который прекрасно работает ...

Странно, как сложные решения заставляют программистов на c # чувствовать себя счастливее !!!

0 голосов
/ 19 апреля 2011

Вы должны использовать оператор == или метод .Equals ().

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

или

myXmlElement.<Play>.<Trick>.Where(Function(m) m.<Trick>.Value.Equals(string.Empty)).Remove()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...