DGKumar Ответов: 1

Запрос Linq для XML-данных


Я преобразовал код из c# в vb.net
Код C#

static void Main(string[] args)
       {
           string[] strarr = GetStringArray("Locations.xml");

           foreach (string str in strarr)
           {
               Console.WriteLine(str);
           }
       }

       public static string[] GetStringArray(string url)
       {
            XDocument doc = XDocument.Load(url);

           var locations = from l in doc.Descendants("Location")
                           select (string)l.Attribute("Name");

           return locations.ToArray();
       }



VB код:
Private Shared Sub Main(args As String())
       Dim strarr As String() = GetStringArray("Locations.xml")

       For Each str As String In strarr
           Console.WriteLine(str)
       Next
   End Sub

   Public Shared Function GetStringArray(url As String) As String()
       Dim doc As XDocument = XDocument.Load(url)

   Dim locations = From l In doc.Descendants("Location")DirectCast(l.Attribute("Name"), String)

       Return locations.ToArray()
   End Function


но приведенный ниже код не работает в vb.net особенно
DirectCast


Dim locations = From l In doc.Descendants("Location")DirectCast(l.Attribute("Name"), String)


DirectCast

Не могли бы вы помочь мне, как привести приведенное выше значение в строку

Что я уже пробовал:

Я попробовал с приведенным ниже кодом
Dim locations = From l In doc.Descendants("Location")DirectCast(l.Attribute("Name"), String)

1 Ответов

Рейтинг:
2

Meshack Musundi

Существует несколько способов сделать это: вы можете использовать синтаксис выражения запроса,

Dim locations = From l In doc.Descendants("Locations")
                Select CStr(l.Attribute("Name"))
или вы можете избежать синтаксиса выражения запроса и просто использовать стандартный синтаксис точечной нотации,
Dim locations = doc.Descendants("Locations").Select(Function(l) l.Attribute("Name").Value)
или вы можете использовать свойства оси,
Dim locations = doc...<Locations>.Select(Function(l) l.@Name)


DGKumar

Спасибо, что откликнулись на его работу..Не могли бы вы сказать мне, пожалуйста, как получить несколько столбцов в одной и той же логике?
Тусклые локации = док.Потомки ("Локации").Выберите(функция(l) l.атрибут("имя").Ценность)
Dim locations2 = doc.Потомки ("Локации").Выберите(функция(l) l.атрибут("город").Ценность)
И то, и другое мне нужно хранить в одной тусклой переменной.

DGKumar

Я пробовал использовать приведенный ниже код, но не работал
Dim svcResultFields = XMLData.Элементы ("Локации").Выберите(функция(Ф) новый{ наименование = Ф.Атрибут("Имя").Значение, тип = F. атрибут ("город").Ценность}).Метод toArray()

Meshack Musundi

Вы можете получить коллекцию анонимных типов, выполнив,

Dim results = doc...<Locations>.Select(Function(l) New With {.Name = l.@Name, .Type = l.@City})

или
Dim results = doc.Descendants("Locations").Select(Function(l) New With {.Name = l.Attribute("Name").Value, .Type = l.Attribute("City").Value})

Maciej Los

5ед!

DGKumar

Привет, теперь я могу получить оба значения.
Если я хочу получить значения из этого результата, я получаю приведенную ниже ошибку не в состоянии получить значения в foreach in.
Ошибка: невозможно привести объект типа ' WhereSelectEnumerableIterator`2[System. Xml.Linq.XElement, Система.String] система 'to type'.В разделе iconvertible'

Я пытался :
Dim results () As String = provisioningXMLData.Потомки ("Локации").Выберите (Function (l) New With {.Video = l.Attribute("Name").Имя,. Type = L. атрибут ("тип").Ценность})
Для каждого deniedStatus в качестве строки в результатах
Если отрицается статус.Имя Ничего Не Значит
isHSIAdataDenied = True
Ещё
isHSIAdataDenied = False
Конец, Если

Выход Для
Следующий

Я не могу получить правильный foreach в vb.net для этой коллекции

Meshack Musundi

Вы получаете ошибку, потому что он не может привести анонимный тип к string. Ваш results переменная должна быть типа IEnumerable <Anonymous Type> не строковый массив.