Пожалуйста, помогите мне прочитать строку из моего XML-файла и просто распечатать его на MessageBox - PullRequest
1 голос
/ 20 декабря 2009

Вот мой XML-файл:

<?xml version="1.0" encoding="utf-8" ?>
<Hero>
  <Legion>
    <Andromeda>
      <HeroType>Agility</HeroType>
      <Damage>39-53</Damage>
      <Armor>3.1</Armor>
      <MoveSpeed>295</MoveSpeed>
      <AttackType>Ranged(400)</AttackType>
      <AttackRate>.75</AttackRate>
      <Strength>16</Strength>
      <Agility>27</Agility>
      <Intelligence>15</Intelligence>
      <Icon>Images/Hero/Andromeda.gif</Icon>
    </Andromeda>
    <WitchSlayer>
      <HeroType>Agility</HeroType>
      <Damage>39-53</Damage>
      <Armor>3.1</Armor>
      <MoveSpeed>295</MoveSpeed>
      <AttackType>Ranged(400)</AttackType>
      <AttackRate>.75</AttackRate>
      <Strength>16</Strength>
      <Agility>27</Agility>
      <Intelligence>15</Intelligence>
      <Icon>Images/Hero/Andromeda.gif</Icon>
    </WitchSlayer>
  </Legion>
</Hero>

Вот мой метод, но он не работает, поэтому я не знаю, что делать.

public string GetHeroIcon(string Name)
    {
        //Fix later. Load the XML file from resource and not from the physical location.
        HeroInformation = new XPathDocument(@"C:\Users\Sergio\Documents\Visual Studio 2008\Projects\Erth v0.1[WPF]\Tome of Newerth v0.1[WPF]\InformationRepositories\HeroRepository\HeroInformation.xml");
        Navigator = HeroInformation.CreateNavigator();

        Navigator.MoveToRoot();
        Navigator.MoveToChild("Witch","Legion");
        string x = "";

        do
        {
            x += Navigator.Value;
        } while (Navigator.MoveToNext());

        return x;
    }

Мне нужна помощь в создании метода, который получает строковый параметр «Имя», а затем возвращает все атрибуты элемента XML.

В псевдокоде:

public void FindHero(string HeroName)
{
    //Find the "HeroName" element in the XML file.
    //For each tag inside of the HeroName parent element,
    //add it to a single string and blast it out through a MessageBox.
}

Я УЧУ, как это использовать, пожалуйста, не оставляйте снобистских замечаний вроде «мы не сделаем этого за вас». Я не прошу чего-то новаторского здесь, просто простой случай использования того, что мне нужно в моей программе и для моего обучения ничего другого. : D Я делаю все приложение в WPF, и я могу буквально сказать, что я не сделал ОДНУ одну вещь с предыдущими знаниями, я делаю это просто для изучения новых вещей в свободное время. Спасибо большое ТАК, ты молодец!

Ответы [ 3 ]

2 голосов
/ 20 декабря 2009
private static string GetHeroIcon(string name)
{
    XDocument doc = XDocument.Load("C:/test.xml");
    return doc.Descendants(name).Single().Element("Icon").Value;
}
0 голосов
/ 20 декабря 2009

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я скопировал и вставил код из своего кода и провел некоторый рефакторинг в этом окне. Он может не скомпилироваться при первом запуске, но это может означать, что потребуется 10 минут, чтобы получить его там, где он должен быть.

Я настоятельно рекомендую вам использовать десериализацию XML. Это объектно-ориентированный, безопасный тип и просто гладкий.

Попробуйте это: 1) Создайте серию классов: один для Героя, Легиона, Убийцы Ведьм и Андромеды.

Вот пример класса Андромеды:

using System.Xml.Serialization;

[XmlRoot( "Andromeda" )]
public class Andromeda
{
   [XmlElement( "Damage" )]
   public String Damage
   {
      get;set;
   }

   [XmlElement( "Armor" )]
   public double Armor
   {
      get;set;
   }
}

Класс Hero должен содержать экземпляр Legion, а Legion должен содержать остальное для имитации макета пакета XML.

2) Используйте XmlSerializer для десериализации данных:

XmlSerializer xmlSerializer = new XmlSerializer( typeof( Hero ) );

using ( StringReader reader = new StringReader( xmlDataString ) )
{
    Hero hero = ( Hero ) xmlSerializer.Deserialize( reader );
}

Если вы установите его правильно, у вас останется экземпляр героя, который содержит вложенные объекты и все данные. Круто, да?

0 голосов
/ 20 декабря 2009

Прежде всего, поскольку вы пометили этот вопрос WPF, вы должны знать, что WPF имеет отличную поддержку для привязки непосредственно к данным XML. Затем вы можете, например, сопоставить изображение в графическом интерфейсе непосредственно с элементом Icon в файле XML. См. Эту ссылку, например: http://www.longhorncorner.com/UploadFile/cook451/DataBindingXAML12102005134820PM/DataBindingXAML.aspx (первое нажатие на Google для "wpf databinding xml")

Из кода вы можете создать XPathDocument из вашего XML-файла, затем получить Navigator и, наконец, запустить пользовательские XPath запросы к нему, например:

// Get's the value of the <icon> tag for a hero
var node = myNavigator.SelectSingleNode("/Legion/Hero/" + nameOfHero + "/Icon");    
var icon = node.Value;
// To get all the nodes for that hero, you could do
var nodeIter = myNavigator.Select("/Legion/Hero/" + nameOfHero)
var sb = new StringBuilder();
while (nodeIter.MoveNext())
{
    sb.AppendLine(nodeIter.Current.Name + " = " + nodeIter.Current.Value);
}
MessageBox.Show(sb.ToString());

См. эту статью по кб для примера.

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