Linq to XML, как это сделать в vb.net - PullRequest
3 голосов
/ 28 января 2010

Этот фрагмент взят из этого ответа

var reports = from report in xml.Descendants("report")
    where report.Element("name").Value.Contains("Adjustment Report")
    select new {
        Name = report.Element("name").Value,
        Extension = report.Element("extension").Value,
        FileType = report.Element("filetype").Value,
        Fields = report.Elements("field")
            .Select(f => new {
                Name = f.Attribute("name").Value, 
                Type = f.Attribute("type").Value 
            }).ToArray()
    };

Из-за жизни я не могу понять синтаксис этой части в vb.net:

* +1007 *

Что я пытаюсь сделать - мой xml выглядит так:

<items>
 <item>
  <id>data</id>
  <foto>
   <fotoname>img1.jpg</fotoname>
   <fotoorder>1</fotoorder>
  </foto>
  <foto>
   <fotoname>img2.jpg</fotoname>
   <fotoorder>2</fotoorder>
  </foto>
 </item>
</items>

Мне нужно, чтобы у моего объекта был список (или коллекция любого вида) элементов фото.

Ответы [ 3 ]

5 голосов
/ 28 января 2010

LINQ to XML является одной из областей, где VB.NET предлагает совершенно другой синтаксис, чем C #. Вы можете использовать тот же метод цепочки, но я предпочитаю синтаксис VB.NET LINQ, который выглядит следующим образом:

Sub Main()
    Dim myXml = <items>
                    <item>
                        <id>data</id>
                        <foto>
                            <fotoname>img1.jpg</fotoname>
                            <fotoorder>1</fotoorder>
                        </foto>
                        <foto>
                            <fotoname>img2.jpg</fotoname>
                            <fotoorder>2</fotoorder>
                        </foto>
                    </item>
                </items>

    Dim fotoElementsQuery = From f In myXml...<foto> _
                            Select f

    Dim fotoAnonymousTypeQuery = From f In myXml...<foto> _
                                 Select f.<fotoname>.Value, f.<fotoorder>.Value

    Dim fotoNamedTypeQuery = From f In myXml...<foto> _
                             Select New Foto With {.Name = f.<fotoname>.Value, .Order = f.<fotoorder>.Value}

End Sub

Public Class Foto

    Private _name As String
    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

    Private _order As Integer
    Public Property Order() As Integer
        Get
            Return _order
        End Get
        Set(ByVal value As Integer)
            _order = value
        End Set
    End Property

End Class

Это дает вам 3 различных типа IEnumerable результатов.

  1. fotoElementsQuery будет иметь тип IEnumerable(Of XElement)
  2. fotoAnonymousTypeQuery будет иметь тип IEnumerable(Of <anonymous type>). Элементы анонимного типа будут иметь имена элементов xml - fotoname и fotoorder.
  3. fotoNamedTypeQuery будет иметь тип IEnumeragle(Of Foto)

LINQ-запросы на самом деле еще не выполнялись в приведенном выше коде. Чтобы получить список (и выполнить запрос), вызовите метод расширения .ToList() или .ToArray().

Обновление: Лучший способ узнать о совершенстве LINQ (и LINQ to XML) в VB.NET - это посмотреть серию видео «Как сделать я» от Бет Масси. http://msdn.microsoft.com/en-us/vbasic/bb466226.aspx#linq

5 голосов
/ 01 февраля 2010

Чтобы конкретизировать некоторые другие ответы:

В VB.NET вы можете использовать операторы XML-оси для упрощения синтаксиса метода. Например, <root>..<child> - это то же самое, что XElement («root»). Elements («child»). В этом случае ребенок должен находиться прямо под корнем. Если вы хотите найти узлы независимо от того, где они существуют в дочерних узлах, вы можете использовать .Descendents вместо .Elements или синтаксис VB с тремя точками следующим образом: <root>...<descendentNodeName>. Если вы хотите получить доступ к атрибуту, используйте .@ следующим образом: <root>.@attributeName.

Из ответа Мерфа вы можете переписать его в VB следующим образом:

Fields = (From f In report.<field> _
          Select Name = f.@name, Type = f.@type).ToArray()

Это также можно записать с использованием синтаксиса лямбда следующим образом:

Fields = report.<field> _
         .Select(Function(f) New With { _
             Name = f.@name, Type = f.@type).ToArray()
0 голосов
/ 28 января 2010

Ха, прочитайте это вчера (если я прав - и я, вероятно, не на 100% по всему синтаксису ...)

Fields = report.Elements("field")
    .Select(Function(f) new { 
        Name = f.Attribute("name").Value,
        Type = f.Attribute("type").Value
    }).ToArray()

Ключ ключа - если моя память работает правильно -меняет "f =>" на "Function (f)"

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