这是我的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,你摇滚!
答案 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 );
}
如果你设置正确,你将留下一个包含嵌套对象和所有数据的英雄实例。很酷,嗯?