代码之家  ›  专栏  ›  技术社区  ›  Sergio Tapia

请帮我从XML文件中读取一个字符串,然后在一个消息框中打印出来。

  •  1
  • Sergio Tapia  · 技术社区  · 15 年前

    这是我的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中完成了整个应用程序,我可以毫不夸张地说,我没有用以前的知识做过一件事,我只是在业余时间学习新的东西。

    多谢了,所以,你这个摇滚乐手!

    3 回复  |  直到 15 年前
        1
  •  2
  •   Yuriy Faktorovich    15 年前
    private static string GetHeroIcon(string name)
    {
        XDocument doc = XDocument.Load("C:/test.xml");
        return doc.Descendants(name).Single().Element("Icon").Value;
    }
    
        2
  •  0
  •   Isak Savo    15 年前

    首先,由于您已经标记了这个问题wpf,您应该知道wpf对直接绑定到XML数据有很好的支持。例如,您可以将GUI中的图像直接映射到XML文件中的图标元素。请参见此链接,例如: http://www.longhorncorner.com/UploadFile/cook451/DataBindingXAML12102005134820PM/DataBindingXAML.aspx (第一个点击谷歌的“WPF数据绑定XML”)。

    从代码中,可以创建 XPathDocument 然后,从XML文件 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 举个例子。

        3
  •  0
  •   Bill the Lizard    15 年前

    免责声明:我复制并粘贴了代码中的代码,并在此窗口中进行了一些重构。它可能不会在第一次运行时编译,但这可能意味着它需要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类应该包含一个军团实例,军团应该包含其余的实例来模拟XML包的布局。

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

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

    如果设置正确,则会留下一个包含嵌套对象和所有数据的Hero实例。酷,嗯?