【发布时间】:2011-11-02 00:03:39
【问题描述】:
读取 xml 文件以实例化通过 xsd.exe 生成的 .cs 对象集合的最佳实践方法是什么?
我使用 xsd.exe 生成一个 .xsd 文件(架构),然后生成一个 .cs 文件。我按照这里的步骤操作:http://ctrlf5.net/?p=235,效果很好。
我不想使用 XmlReader 并编写一堆代码来导航文档树,同时设置所有公共设置器。我的 xml 文档又长又痛苦。我只想点击简单的按钮并收集我的收藏。新手,我刚刚在 xsd 上度过了一个很棒的时刻——它让我的 .cs 文件变得多么酷——但是如果我现在必须编写 500 行代码来实例化我的类——那就太棒了。现在有一种简单的方法可以实例化我的收藏,而我只是不知道它是什么或如何用谷歌搜索它,这才有意义。回复这个已经回答的问题很高兴接受。
这是我的 xml 和代码的样子:
<?xml version = "1.0" ?>
<MY_OBJECT>
<UNIQUE_ID>ABC</UNIQUE_ID>
<TYPE>TEST</TYPE>
<CLASSALIST>
<CLASSA>
<A>0</A>
<B>0</B>
<C>2598960</C>
<HS>
<H>
<DESCRIPTION>MYDESC</DESCRIPTION>
<ADDITIONAL>0</ADDITIONAL>
</H>
</HS>
</CLASSA>
</CLASSALIST>
<BONUSES>
<BONUS>
<BONUS_TYPE>Bonus Schedule</BONUS_TYPE>
<BONUS_DATA>
<ALPHA>1</ALPHA>
<BETA>4</BETA>
</BONUS_DATA>
</BONUS>
</BONUSES>
<REVISION>A</REVISION>
<CONDITION>
<GENERAL></GENERAL>
<EXCEPTION></EXCEPTION>
</CONDITION>
<ACTIONABLE>True</ACTIONABLE>
<VERSION>12345</VERSION>
<COMMENTS></COMMENTS>
</MY_OBJECT>
这里我尝试反序列化为 List:
[Test]
public void AutoXmlSampleList()
{
var xs = new XmlSerializer(typeof(List<MY_OBJECT>));
List<MY_OBJECT> list;
using (var reader = XmlReader.Create(_inputFilename2))
{
list = (List<MY_OBJECT>)xs.Deserialize(reader);
}
Assert.AreEqual("ABC", list[0].UNIQUE_ID);
}
这是错误信息:
System.InvalidOperationException : Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'Test.MY_OBJECTCLASSALISTCLASSA[]' to 'Test.MY_OBJECTCLASSALISTCLASSA'
error CS0030: Cannot convert type 'Test.MY_OBJECTBONUSESBONUS[]' to 'Test.MY_OBJECTBONUSESBONUS'
error CS0030: Cannot convert type 'Test.MY_OBJECTCLASSALISTCLASSAHSH[]' to 'Test.MY_OBJECTCLASSALISTCLASSAHSH'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTCLASSALISTCLASSA' to 'Test.MY_OBJECTCLASSALISTCLASSA[]'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTBONUSESBONUS' to 'Test.MY_OBJECTBONUSESBONUS[]'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTCLASSALISTCLASSAHSH' to 'Test.MY_OBJECTCLASSALISTCLASSAHSH[]'
如果我尝试反序列化而不是 List:
[Test]
public void AutoXmlSampleNotList()
{
var xs = new XmlSerializer(typeof(MY_OBJECT));
MY_OBJECT myObject;
using (var reader = XmlReader.Create(_inputFilename2))
{
myObject = (MY_OBJECT)xs.Deserialize(reader);
}
Assert.AreEqual("ABC", myObject.UNIQUE_ID);
}
这会导致类似的错误:
System.InvalidOperationException : Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'Test.MY_OBJECTCLASSALISTCLASSA[]' to 'Test.MY_OBJECTCLASSALISTCLASSA'
error CS0030: Cannot convert type 'Test.MY_OBJECTBONUSESBONUS[]' to 'Test.MY_OBJECTBONUSESBONUS'
error CS0030: Cannot convert type 'Test.MY_OBJECTCLASSALISTCLASSAHSH[]' to 'Test.MY_OBJECTCLASSALISTCLASSAHSH'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTCLASSALISTCLASSA' to 'Test.MY_OBJECTCLASSALISTCLASSA[]'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTBONUSESBONUS' to 'Test.MY_OBJECTBONUSESBONUS[]'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTCLASSALISTCLASSAHSH' to 'Test.MY_OBJECTCLASSALISTCLASSAHSH[]'
【问题讨论】:
-
您正在寻找 XmlSerializer。查看其他 Stackoverflow 帖子 stackoverflow.com/questions/792976/…
-
你也不应该使用 xsd.exe。如果可以使用 svcutil.exe 生成的类,那就更好了。
-
只是反序列化
MY_OBJECT而不是List<MY_OBJECT>。 -
不就是一个 count == 1 的列表吗?
-
是否可以将生成的 C# 代码和/或 XML 模式上传到某处?这个问题似乎很微妙:)