2

我有点不合时宜。我使用 xsd.exe 从 xml 文件创建 xsd 架构,然后从该 xsd 创建 C# 类。这一切似乎都很好。

目前我只是想让 XML 反序列化。如果我最初用于构建类的文件与我正在反序列化的文件相同。这是我的代码:

String xsdPath=@"C:\Users\tol56881\Documents\dnd4e.xsd";
String xmlPath=@"C:\Users\tol56881\Documents\dnd4e.xml";
String xsdNamespace="";

//Validation stuff
XmlParserContext context = new XmlParserContext(null, null, "", XmlSpace.None);
XmlValidatingReader vr = new XmlValidatingReader(xmlPath, XmlNodeType.Element, context);
vr.ValidationType = ValidationType.Schema;
vr.Schemas.Add(xsdNamespace, xsdPath);
while (vr.Read()) ;

//Actually reading the file
TextReader tr = new StreamReader(xmlPath);
D20Character character = (D20Character)(new XmlSerializer(typeof(D20Character))).Deserialize(tr);

它编译得很好,但是当我尝试运行它时,我得到了一个针对四个不同对象重复的错误。我在下面给出了一个示例,更改了对象的名称。

Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'Namespace.ObjectName[]' to 'Namespace.ObjectName'
error CS0029: Cannot implicitly convert type 'Namespace.ObjectName' to 'Namespace.ObjectName[]'

所以看起来程序正试图从数组到对象再回到数组,但我不太确定。自动生成的类代码是一团乱麻,很难通过。我希望这里可能缺少一些简单的东西。

谢谢!

4

2 回答 2

10

我设法解决了这个问题。所讨论的四个对象中的每一个都生成为双索引数组,例如:

    private loot[][] lootTallyField;

    public loot[][] LootTally
    {
        get
        {
            return this.lootTallyField;
        }
        set
        {
            this.lootTallyField = value;
        }
    }

我所做的只是删除了一组括号,这一切似乎都运行良好。反序列化没有问题,并且对反序列化对象的快速检查使其看起来数据已正确加载。

    private loot[] lootTallyField;

    public loot[] LootTally
    {
        get
        {
            return this.lootTallyField;
        }
        set
        {
            this.lootTallyField = value;
        }
    }

仍然不确定为什么 xsd.exe 如果它们不应该是双索引的话。我觉得我仍然缺少一些东西,因此为什么这个问题仍然存在。

特别是,如果我需要重新生成此代码,那么我需要重新应用修复程序,这首先违背了使用部分类的目的......

于 2009-05-01T19:21:43.673 回答
6

xsd.exe工具有问题,我会尽力解释。

如果您有一个带有序列的 complexType,其中有一个带有序列的子 complexType,并且第一个没有任何其他元素/属性,那么生成的类将只有 1 个生成类型,而不是 2,它将是一个 double大批。

如果你将双数组变成一个数组,你将能够很好地反序列化你的 xml。但是,这将产生以下意外结果。如果您的 xml 如下所示。

<root>
    <loot>
        <tally>value1</tally>
        <tally>value2</tally>
    </loot>
    <loot>
        <tally>value3</tally>
        <tally>value4</tally>
    </loot>
</root>

然后你的反序列化对象,在 lootTally 数组中将只包含 value3 和 value4 项目,而不是全部 4。

因此,您有 2 个选项可以正确解决此问题:

  1. 通过在第一个序列中添加一个 dummy 来更改 xsd 文件,然后再次运行 xsd.exe,以便在生成类时不会创建双精度数组,然后您可以从类中删除 dummy 属性。
  2. 更改生成的类,添加一个名为 loot 的新类,它将包含您已经拥有的一系列计数对象(并且只需要更改名称)。

请注意,在选项 2 中,如果您将 XmlArrayItemAttribute 更改为 XmlElementAttribute,您可能必须更改一些声明。

希望这可以帮助

于 2015-05-23T22:13:58.333 回答