尝试将xml文件转换为对象

时间:2010-08-09 22:43:01

标签: c# .net class

我想知道你对此的看法是什么。我正在尝试将xml文件转换为.net对象。它是来自魔兽世界军械库的xml文件。这是一个例子。

<?xml version="1.0" encoding="UTF-8"?>
<baseStats>
<strength attack="48" base="48" block="-1" effective="58"/>
 <agility armor="114" attack="-1" base="47" critHitPercent="4.27" effective="57"/>
 <stamina base="70" effective="1186" health="11680" petBonus="-1"/>
 <intellect base="198" critHitPercent="10.41" effective="1529" mana="22655" petBonus="-1"/>
 <spirit base="190" effective="770" healthRegen="39" manaRegen="503"/>
 <armor base="2150" effective="2150" percent="12.37" petBonus="-1"/>
</baseStats>

我已经想过将这种方法转换为对象的两种方法,我想听听你对它的看法。我会告诉他们。

class BaseStats{
 public int StrengthAttack{get;set;}
 public int StrengthBase{get;set;}
 public int StrengthBlock{get;set;}
 ...
 public int ArmorBase{get;set;}
 public int ArmorEffective{get;set;}
 ...
}

class BaseStats{
 public Strength Strength{get;set;}
 public Armor Armor{get;set;}

 public class Strength{
  public int Attack{get;set;}
  public int Base{get;set;}
  public int Block{get;set;}
 }

 public class Armor{
  public int Base{get;set;}
  public int Effective{get;set;}
 }
}

你看到我在这里尝试的东西吗?您对这些方式的看法是什么?或者你能想到其他人吗?

4 个答案:

答案 0 :(得分:3)

使用匿名类型的无类设计

这是另一种方式,使用.NET 3.5,如果你不想设计一个显式的class,你可以动态地构建对象anonymous type;一个警告是对象属性在初始化后是只读的。

使用XML LINQ类查询XML内容。

using System;
using System.IO;
using System.Xml.Linq;

加载XML字符串并查询它以创建对象。

// 1. Load your string into a document.
XDocument xdoc = XDocument.Load(new StringReader(my_WoW_XML_String));

// 2. Create the anonymous type...
var statsObject = new
{
    StrengthInfo = new
    {
        Attack = int.Parse(xdoc.Element("strength").Element("attack").Value),
        Base = int.Parse(xdoc.Element("strength").Element("base").Value),
        Block = int.Parse(xdoc.Element("strength").Element("block").Value),
        Effective = int.Parse(xdoc.Element("strength").Element("effective").Value),
    },

    AgilityInfo = new
    {
        Armor = int.Parse(xdoc.Element("agility").Element("armor").Value),
        Attack = int.Parse(xdoc.Element("agility").Element("attack").Value),
        Base = int.Parse(xdoc.Element("agility").Element("base").Value),
        CritHitPercent = int.Parse(xdoc.Element("agility").Element("critHitPercent").Value),
        Effective = int.Parse(xdoc.Element("agility").Element("effective").Value),
    }

    // Do the same with <spirit> and <armor> elements, etc.
    // Include only the properties you want from the XML. 

}; // end anonymous object.

通常使用您的匿名对象:

Console.Write("strength: attack={0}, effective={1}; armor agility={2}", 
    statsObject.StrengthInfo.Attack,
    statsObject.StrengthInfo.Effective,
    statsObject.AgilityInfo.Armor);

// Do whatever you want with the object version of WoW stats.

如果要使用相同的模式处理多个XML文件,则只需将上述所有内容包装在一个循环中,一次处理一个。

答案 1 :(得分:2)

如果您有XSD架构(或可以创建一个),我已经使用LinqToXsd来创建一些快速对象。 LinqToXsd的优点在于它创建了可以用来轻松地将XML解析为对象的方法。

Microsoft已将其作为开源发布 - 您只需使用命令行调用来传入.xsd,它将生成包含所有类的.cs文件。

答案 2 :(得分:1)

class CElement
{
    public int? attack { get; set; }
    public int? base { get; set; }
    public int? block { get; set; }
    public int? effective { get; set; }
    public int? petBonus { get; set; }
    public int? mana { get; set; }
    public int? healthRegen { get; set; }
    public int? manaRegen { get; set; }

    public double? critHitPercent { get; set; }
    public double? percent { get; set; }
}

class CBaseStats
{
    public CElement strength;
    public CElement agility;
    public CElement stamina;
    public CElement intellect;
    public CElement spirit;
    public CElement armor;
}

答案 3 :(得分:0)

如果你有完整的xml, 1.使用xsd.exe工具从xml生成xsd 2.使用xsd.exe工具从生成的xsd生成类

http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx