я пытаюсь работать с xml linq xdocument в vb.net - PullRequest
0 голосов
/ 06 октября 2010

Я пытаюсь написать приложение для Windows Phone 7, которое читает из xml с использованием xdocument, но у меня есть несколько проблем.

Если я делаю это:

Dim xml As XDocument = XDocument.Load(e.Result)
System.Diagnostics.Debug.WriteLine(xml.ToString)

Или это:

System.Diagnostics.Debug.WriteLine(xml.Elements.Value.ToString)

, затем данные xml выводятся в окно непосредственного взаимодействия в виде строки, доказывающей, что данные существуют, но если я сделаю это:.title и я также ничего не получаю, когда я делаю что-то вроде этого:

Dim count As Integer = xml.Descendants("count").Value

Что я делаю не так?Спасибо.

xml выглядит примерно так:

<productslist>
  <count>2</count>
  <products>
    <product>
        <productId>1</productId>
        <title>test item 1 </title>
        <price>4.99</price>
        <category>
            <categoryId>1</categoryId>
            <categoryName>cat 1</categoryName>
        </category>
    </product>
    <product>
        <productId>2</productId>
        <title>test item 2</title>
        <price>10.99</price>
        <category>
            <categoryId>2</categoryId>
            <categoryName>cat 2</categoryName>
        </category>
    </product>
 </productslist>

Ответы [ 2 ]

1 голос
/ 07 октября 2010

Ваш оператор LINQ не проецируется в анонимный тип со свойством Title.Вы получаете IEnumerable<string> обратно напрямую.

Попробуйте вместо этого:

Dim products = From product In xml.Descendants("product") _
               Select product.Element("title").Value

For Each product In products
     Debug.WriteLine("Title: " & product)
Next

Тем не менее, переменная products лучше назвать titles.Если вы хотите проецировать в анонимный тип, вам нужно использовать With New { .Prop1 = data, .Prop2 = other }.Точка должна быть добавлена ​​к каждому имени свойства.Вот пример:

Dim products = From product In xml.Descendants("product") _
               Select New With { .Title = product.Element("title").Value }

For Each product In products
     Debug.WriteLine("Title: " & product.Title)
Next

Для вашего примера не похоже, что нужен анонимный тип.Если у вас есть несколько свойств для проецирования, это становится полезным.

РЕДАКТИРОВАТЬ: в ответ на ваш комментарий, пространство имен может быть присоединено к вашему XML.Если это так, вам нужно ссылаться на него, чтобы ссылаться на любой элемент.

Если у вашего XML есть пространство имен, ему нужно указать xmlns, например:

<productslist xmlns="http://domain.com/namespace">

Вы бы тогданеобходимо изменить ваш код, чтобы получить пространство имен и объединить его с вашими элементами следующим образом:

Dim ns = xml.Root.GetDefaultNamespace()

Dim products = From product In xml.Descendants(ns + "product") _
               Select product.Element(ns + "title").Value
0 голосов
/ 07 октября 2010

Извините, я не знаю VB Но в C # этот код подойдет-

var query = doc.Descendants("product").Select(x => new {Title= x.Element("title").Value});

            foreach (var item in query)
            {
                Console.WriteLine(item.Title);

            }

Также отсутствует опубликованный вами xml </products>. узел (конечный тег), надеюсь, это просто ошибка копирования-вставки.

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