C# 尝试将xml文件转换为对象
我想知道你对此有什么看法。我正在尝试将xml文件转换为.net对象。这是一个来自魔兽世界军械库的xml文件。这里有一个例子C# 尝试将xml文件转换为对象,c#,.net,class,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" critHitPerce
<?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>
或
你明白我在尝试什么吗。你对每一种方式有什么看法。或者你能想到其他的吗?如果你有XSD模式(或者可以创建一个),我会用它来创建一些快速对象。LinqToXsd的好处在于它创建了一些方法,您可以使用这些方法轻松地将XML解析到对象中
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;
}
Microsoft已将其作为开源发布—您只需使用命令行调用传入.xsd,它将为您的所有类生成一个.cs文件。如果您有xsd模式(或可以创建一个),我将用于创建一些快速对象。LinqToXsd的好处在于它创建了一些方法,您可以使用这些方法轻松地将XML解析到对象中 Microsoft已将其作为开放源代码发布—您只需使用命令行调用传入.xsd,它将生成一个包含所有类的.cs文件。使用匿名类型的无类设计 另一种方法是,在.NET3.5中,如果您不想设计一个显式的
类
,您可以将对象动态地构建为一个类;一个警告是对象属性在初始化后是只读的
使用XMLLINQ类查询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.
如果要使用同一模式处理多个XML文件,则只需将上述所有文件包装在一个循环中,一次处理一个。使用匿名类型的无类设计
另一种方法是,在.NET3.5中,如果您不想设计一个显式的类
,您可以将对象动态地构建为一个类;一个警告是对象属性在初始化后是只读的
使用XMLLINQ类查询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.
如果要使用相同的模式处理多个XML文件,则只需将上述所有文件包装在一个循环中,一次处理一个文件。如果得到完整的XML,
1.使用xsd.exe工具从xml生成xsd
2.使用xsd.exe工具从生成的xsd生成类
如果您得到完整的xml,
1.使用xsd.exe工具从xml生成xsd
2.使用xsd.exe工具从生成的xsd生成类
这实际上与XML转换无关——这是一个类设计问题。一旦你设计好了课程,你就会有一个转换问题。好吧,是的,也许这是一种更好的心态。首先设计类,然后尝试如何从xml文件获取它。我明白你的意思。但是,该类必须基于XML文件。因此,即使我首先开始设计类,我仍然有这个问题。因为我建议的两种方法看起来都不太好,这实际上与XML转换无关——这是一个类设计问题。一旦你设计好了课程,你就会有一个转换问题。好吧,是的,也许这是一种更好的心态。首先设计类,然后尝试如何从xml文件获取它。我明白你的意思。但是,该类必须基于XML文件。因此,即使我首先开始设计类,我仍然有这个问题。因为我建议的两种方法似乎都不太好。是的,这似乎是一种很好的方法。但是,我不喜欢的是,加速度强度并没有使用它所有的特性。这样做似乎有点奇怪。不过我可以挑剔xD@TimoWillemsen:若属性不存在,那个么你们将她的值保留为NULL,因为我使用了int?双倍?声明insead的int和doubleYup是真的。我只想在我正在写的图书馆里创建一个类。为了尽可能地保持它的干净,避免混淆(因为其他人正在使用它,理想情况下),我正试图避免这些事情。@Timo Willemsen:啊,那么你必须做好设计,我只回答你的问题,我不知道你想要实现什么。这似乎是一个好的方法。但是,我不喜欢的是,加速度强度并没有使用它所有的特性。这样做似乎有点奇怪。不过我可以挑剔xD@TimoWillemsen:若属性不存在,那个么你们将她的值保留为NULL,因为我使用了int?双倍?声明insead的int和doubleYup是真的。我只想在我正在写的图书馆里创建一个类。为了尽可能地保持它的干净,避免混淆(因为其他人在使用它,理想情况下),我正试图避免这些事情。@Timo Willemsen:啊,那么你必须做好设计,我只回答你的问题,我不知道你想要实现什么这看起来不错,但不幸的是我没有访问XSD方案的权限。我把它放在书签里了,它看起来真的很有用。我明白。但是,您可以考虑是否更容易编写所有代码(声明、获取、集合、构造函数、解析器等),或者编写与模式匹配的小XSD。如果编写XSD,您可以轻松地自动生成.NET代码并再次解析逻辑。只是一个想法。祝你好运!:)没错,但我给出的示例只是实际XML文件的一小部分。实际的XML文件大约要大200倍:p这看起来不错,但不幸的是,我无法访问XSD方案。我把它放在书签里了,它看起来真的很有用。我明白。但是,您可以考虑是否更容易编写所有代码(声明、获取、集合、构造函数、解析器等),或者编写与模式匹配的小XSD。如果编写XSD,您可以轻松地自动生成.NET代码并再次解析逻辑。只是一个想法。祝你好运!:)没错,但我给出的示例只是实际XML文件的一小部分。实际的XML文件大约是20个
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.