Есть ли лучший / более быстрый способ написания кода "IsNot Nothing" в Linq-to-XML? - PullRequest
0 голосов
/ 24 апреля 2011

Я имею дело с большим количеством XML для преобразований. Я обычно нахожу, что я провожу большую часть своего времени, делая что-то вроде этого:

Dim elem1 = doc.<bignode>.<smallnode>.SingleOrDefault
If elem1 IsNot Nothing Then
    ''# do my transformation
End If

или

Dim attr1 = doc.<bignode>.<smallnode>.@attribute1
If attr1 IsNot Nothing AndAlso attr1 <> "1" Then
    ''# do my transformation
End If

У меня есть как миллион таких вещей, которые проверяют наличие элемента или атрибута, и только тогда, если он существует, я что-то сделаю.

Полагаю, что все в порядке, но мне просто интересно, есть ли лучший способ справиться с этим, когда я Dim элемент или атрибут и затем начинаю обработку для моего преобразования, если элемента там нет, он просто молча и грациозно проваливаюсь и перехожу к следующему пункту в моем коде.

Есть мысли?

Ответы [ 3 ]

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

Вы смотрели на использование LINQ to XML ?Вместо перебора узлов вы можете создать запрос LINQ, в котором пропущены нулевые значения.Затем вы перебираете фильтрованный набор, избавляя вас от проверок IsNot Nothing.

1 голос
/ 25 апреля 2011

Вы можете использовать метод расширения для более быстрой обработки чека IsNot Nothing:

<Extension()>
Sub SafeTransform(ByVal element As XElement, ByVal transform As Action(Of XElement))
  If element IsNot Nothing Then
    transform(element)
  End If
End Sub

Вам нужно будет определить преобразование как отдельный метод:

Sub Transform(ByVal element As XElement) As XElement
  '' # do my transformation
End Sub

Назовите это так:

doc.<bignode>.<smallnode>.SingleOrDefault.SafeTransform(AddressOf Transform)

Вы также можете использовать лямбда-выражение:

Dim transform As Action(Of XElement) = Sub(element)
  '' # do my transformation
End Sub
doc.<bignode>.<smallnode>.SingleOrDefault.SafeTransform(transform)

Эти преобразования являются подпрограммами, а не функциями. Если вы вместо этого хотите вернуть преобразованные XElement объекты, вы действительно должны заглянуть в LINQ to XML .

Вот глупый пример LINQ to XML:

Dim doc As XDocument =
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Big>
  <Small Name="Foo"/>
  <Other Name="Bar"/>
</Big>

Dim transformedDoc = new XDocument( _
  new XElement( _
    doc.Root.Name,
    doc.Root.Elements.Select( _
      Function(element) _
        If(element.Name = "Small", new XElement("Transformed", element.Attributes()), element))))

Это преобразованный XML:

<Big>
  <Transformed Name="Foo"/>
  <Other Name="Bar"/>
</Big>
1 голос
/ 24 апреля 2011

AFAIK, проверка на существование таким способом - ваш лучший выбор.ИМО, это хорошее защитное программирование, и как я справляюсь с этим на повседневной основе.Даже когда я активно исключаю значения NULL (или предоставляю им значение по умолчанию), я всегда проверяю существование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...