请帮我从XML文件中读取一个字符串,然后将其打印在MessageBox上

时间:2009-12-19 22:49:25

标签: c# wpf xml

这是我的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;
    }

我需要帮助创建一个接收字符串参数“Name”的方法,然后返回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中的整个应用程序,我可以直截了当地说我没有用以前的知识做过一件事,我这样做只是为了在业余时间学习新东西。

非常感谢SO,你摇滚!

3 个答案:

答案 0 :(得分:2)

private static string GetHeroIcon(string name)
{
    XDocument doc = XDocument.Load("C:/test.xml");
    return doc.Descendants(name).Single().Element("Icon").Value;
}

答案 1 :(得分:0)

首先,由于您已经标记了这个问题WPF,您应该知道WPF对直接绑定到XML数据具有出色的支持。然后,您可以将GUI中的图像直接映射到XML文件中的Icon元素。请参阅此链接,例如:http://www.longhorncorner.com/UploadFile/cook451/DataBindingXAML12102005134820PM/DataBindingXAML.aspx(首次在google上点击“wpf databinding xml”)

从代码中,您可以从XML文件创建XPathDocument,然后get a 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());

有关示例,请参阅this kb article

答案 2 :(得分:0)

免责声明:我从我的代码中复制并粘贴了代码,并在此窗口中进行了一些重构。它可能无法在首次运行时编译,但这可能意味着需要10分钟才能将其运行到需要的位置。

我强烈建议您使用XML反序列化。它是面向对象的,类型安全的,只是平坦的光滑。

试试这个: 1)创建一系列课程:一个用于Hero,Legion,Witchslayer和Andromeda。

以下是仙女座课程的一个例子:

using System.Xml.Serialization;

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

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

Hero类应该包含一个军团实例,军团应该包含其余的以模仿XML数据包的布局。

2)使用XmlSerializer反序列化数据:

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

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

如果你设置正确,你将留下一个包含嵌套对象和所有数据的英雄实例。很酷,嗯?