我有一个相当详细的xml文件。下面是顶级节点(我已经包含了椭圆,因为较低级别的节点都已经很好地形成并且正确地填充了数据):
<?xml version="1.0" encoding="UTF-8"?>
<config>
<Models>...</Models>
<Data>...</Data>
</config>
我使用Visual Studio 2008命令提示符创建了一个xsd文件:
xsd sample.xml
这会很好地生成xsd文件。然后,我使用以下命令从xsd自动生成类:
xsd sample.xsd /classes
为了将xml文件反序列化为类对象,我在helper类中使用了read函数:
public class XmlSerializerHelper<T>
{
public Type _type;
public XmlSerializerHelper()
{
_type = typeof(T);
}
public void Save(string path, object obj)
{
using (TextWriter textWriter = new StreamWriter(path))
{
XmlSerializer serializer = new XmlSerializer(_type);
serializer.Serialize(textWriter, obj);
}
}
public T Read(string path)
{
T result;
using (TextReader textReader = new StreamReader(path))
{
XmlSerializer deserializer = new XmlSerializer(_type);
result = (T)deserializer.Deserialize(textReader);
}
return result;
}
}
使用以下方法尝试反序列化时
var helper = new XmlSerializerHelper<configModels>();
var obj = new configModels();
obj = helper.Read(filepath);
我收到一个错误,我推断是因为解串器正在寻找'Models'节点,但相应的类名是作为根节点和'Model'节点(configModels)的组合生成的。为什么类名生成如下?
我尝试使用以下命令从顶级节点反序列化:
var helper = new XmlSerializerHelper<config>();
var obj = new config();
obj = helper.Read(filepath);
不幸的是,这导致了一系列错误,如下所示:
System.InvalidOperationException was unhandled by user code
Message="Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'Application.Lease[]' to 'Application.Lease'
error CS0030: Cannot convert type 'Application.CashFlow[]' to 'Application.CashFlow'
...ect.
有人可以引导我走向我的xsd自动生成错误吗?
答案 0 :(得分:11)
XSD.EXE是一个好的开始 - 但它远非完美。此外,根据您提供的XML,XSD.EXE无法始终确定某些内容是对象的单个实例,还是开放式对象数组。
您的两个要素 - Application.Lease
和Application.CashFlow
似乎就是这种情况。它们是如何在生成的XSD文件中定义的?这对你有意义吗?很可能,你必须添加一些提示,例如:
<xs:element name="Lease" minOccurs="0" maxOccurs="1" />
对于可选属性,仅为零或一次出现。 xsd.exe工具很难根据单个XML样本文件找出类似的东西。
马克
答案 1 :(得分:10)
转到生成的课程并从[] [] ---&gt;更改所有课程[]
答案 2 :(得分:3)
xsd.exe和列表存在问题。您必须进入生成的类并手动将文件编辑为正确的类型。我已经切换到使用Xsd2Code。到目前为止,它似乎没有这个问题。
答案 3 :(得分:0)
另一个可能导致此问题的问题是标记之间的xml文件内容(意味着内容)仍然会在不应该编码时进行编码。例如,我的内容中的<br>
代码仍然是<br>
而不是<br />
。 xsd生成器将这些元素转换为模式中的元素,然后将它们错误地标记为无界,因为找到了多个元素。取消编码可以解决问题并正确生成类。