Получение неверной информации при очистке XML с помощью Linq - PullRequest
1 голос
/ 04 июля 2010

Изображение У меня есть этот XML:

<ipb>
    <profile>
        <id>335389</id>
        <name>stapia.gutierrez</name>
        <rating>0</rating>
    </profile>
</ipb>

Я пытаюсь получить ID, имя и рейтинг. Любое руководство?

Вот что у меня есть и что я получаю:

public User FindInformation()
{
  string xml = new WebClient().DownloadString(String.Format("http://www.dreamincode.net/forums/xml.php?showuser={0}", userID));
  XDocument doc = XDocument.Parse(xml);

  var id = from u in doc.Descendants("profile")
                 select (string)u.Element("id");

  var name = from u in doc.Descendants("profile")
                 select (string)u.Element("name");

  var rating = from u in doc.Descendants("profile")
                 select (string)u.Element("rating");

  User user = new User();
  user.ID = id.ToString();
  user.Name = name.ToString();
  user.Rating = rating.ToString();

  return user;
}

Это то, что я получаю в своем TextBox для тестирования.

System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String]

Ответы [ 2 ]

1 голос
/ 04 июля 2010

Вам нужно извлечь один экземпляр <profile>, а затем оперировать этим:

XDocument doc = XDocument.Parse(xml);

foreach(var profile in doc.Descendants("profile"))
{
   var id = profile.Element("id").Value;
   var name = profile.Element("name").Value;
   var rating = profile.Element("rating").Value;

   User user = new User();
   user.ID = id;
   user.Name = name;
   user.Rating = rating;
}

Теперь вы выбираете список узлов (doc.Descendants("profile") возвращает списокузлы, возможно, только с одним элементом - но все еще списком), а затем все элементы "id" из этого списка ... не совсем то, что вы хотите, я думаю!

0 голосов
/ 04 июля 2010
var id = from u in doc.Descendants("profile")
select (string)u.Element("id");

Это и другие подобные заявления вернут вам перечислимый, а не конкретный экземпляр. что происходит, если в вашем xml есть много узлов, которые удовлетворяют условию?

Итак, если вы хотите получить первый элемент (или если у вас есть структура xml, точно такая же, как показано выше, без лишних узлов), вызов First или FirstOrDefault должен помочь.

...