Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试将xml文件转换为对象_C#_.net_Class - Fatal编程技术网

C# 尝试将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文件转换为.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>


你明白我在尝试什么吗。你对每一种方式有什么看法。或者你能想到其他的吗?

如果你有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.