如何从XML文件中读取信息并将其设置为类中的属性?

时间:2009-12-19 21:53:33

标签: c# xml

我有这段代码:

public class Hero
{
    XmlReader Reader = new XmlTextReader("InformationRepositories/HeroRepository/HeroInformation.xml");
    XmlReaderSettings XMLSettings = new XmlReaderSettings();        

    public ImageSource GetHeroIcon(string Name)
    {
        XMLSettings.IgnoreWhitespace = true;
        XMLSettings.IgnoreComments = true;
        Reader.MoveToAttribute(" //I'm pretty much stuck here.
    }

}

这是我想要阅读的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>    
  </Legion>

  <Hellbourne>

  </Hellbourne>
</Hero>

我想要获得,/ Icon&gt;元件。

4 个答案:

答案 0 :(得分:2)

MoveToAttribute()对您没有帮助,因为XML中的所有内容都是元素。 Icon元素是Andromeda元素的子元素。

如果您使用3.5 xml之前的处理,最简单的导航XML文档的方法之一是使用XPathNavigatorSee this example for getting started,但基本上您只需要创建它并致电MoveToChild()MoveToFollowing(),它就会让您到达您希望在文档中的位置。

XmlDocument doc = new XmlDocument();
doc.Load("InformationRepositories/HeroRepository/HeroInformation.xml");

XPathNavigator nav = doc.CreateNavigator();

if (nav.MoveToFollowing("Icon",""))
    Response.Write(nav.ValueAsInt);

请注意,XPathNavigator是一种仅向前的机制,因此如果您需要循环或搜索文档,则可能会出现问题。

如果您只是阅读XML以将值放入对象中,则应认真考虑通过object serialization to XML自动执行此操作。这将为您提供一种无痛且自动的方式将xml文件加载回对象。

答案 1 :(得分:0)

根据要加载的元素在对象中标记属性:  请参阅:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributeattribute.aspx

如果出于某种原因,您无法对当前对象执行此操作,请考虑创建一个镜像原始对象的桥对象,并添加一个返回原始对象的AsOriginal()方法。

解决msdn示例:

public class GroupBridge
{
   [XmlAttribute (Namespace = "http://www.cpandl.com")]
   public string GroupName;

   [XmlAttribute(DataType = "base64Binary")]
   public Byte [] GroupNumber;

   [XmlAttribute(DataType = "date", AttributeName = "CreationDate")]
   public DateTime Today;

   public Group AsOriginal()
   {
    Group g = new Group();
    g.GroupName = this.GroupName;
    g.GroupNumber = this.GroupNumber;
    g.Today = this.Today;

    return g;
   }
}

public class Group
{
   public string GroupName;
   public Byte [] GroupNumber;
   public DateTime Today;
}

要从LINQ对象进行Serialize和DeSerialize,您可以使用:

    public static string SerializeLINQtoXML<T>(T linqObject)
    {
         // see http://msdn.microsoft.com/en-us/library/bb546184.aspx
         DataContractSerializer dcs = new DataContractSerializer(linqObject.GetType());

         StringBuilder sb = new StringBuilder();
         XmlWriter writer = XmlWriter.Create(sb);
         dcs.WriteObject(writer, linqObject);
         writer.Close();

         return sb.ToString();
     }

     public static T DeserializeLINQfromXML<T>(string input)
     {
         DataContractSerializer dcs = new DataContractSerializer(typeof(T));

         TextReader treader = new StringReader(input);
         XmlReader reader = XmlReader.Create(treader);
         T linqObject = (T)dcs.ReadObject(reader, true);
         reader.Close();

         return linqObject;
     }

我没有任何来自非LINQ对象的序列化示例代码,但MSDN链接应指向正确的方向。

答案 2 :(得分:0)

您可以使用linq to xml:


    public class XmlTest
    {
        private XDocument _doc;

        public XmlTest(string xml)
        {
            _doc = XDocument.Load(new StringReader(xml);
        }

        public string Icon { get { return GetValue("Icon"); } }

        private string GetValue(string elementName)
        {
            return _doc.Descendants(elementName).FirstOrDefault().Value;
        }
    }

答案 3 :(得分:-1)

您可以使用此正则表达式“<Icon>.*</Icon>”来查找所有图标 然后删除删除标签,并使用它....

将是很多更短

  Regex rgx = new Regex("<Icon>.*</Icon>");
   MatchCollection matches = rgx.Matches(xml);

   foreach (Match match in matches)
    {
    string s= match.Value;
    s= s.Remove(0,6)
    s= s.Remove(s.LastIndexOf("</Icon>"),7);
    console.Writeline(s);
    }