我想知道你对此的看法是什么。我正在尝试将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;}
}
}
你看到我在这里尝试的东西吗?您对这些方式的看法是什么?或者你能想到其他人吗?
答案 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