【问题标题】:Classes generated from XSD does not work with XmlSerializer从 XSD 生成的类不适用于 XmlSerializer
【发布时间】:2014-08-30 04:36:50
【问题描述】:

我需要阅读一些遵循 ONIX 标准的 XML 文件 见:http://www.editeur.org/93/Release-3.0-Downloads/

为此,我下载了 ONIX 3.0 XSD: http://www.editeur.org/files/ONIX%203/ONIX_BookProduct_XSD_schema+codes_Issue_25.zip

使用下载的 XSD 和这个命令“xsd your.xsd /classes”我创建了我想使用的类。

当尝试像这样创建一个新的 Xml 序列化器时:

var xmls = new XmlSerializer(typeof(Model.ONIX.editeur.ONIXMessage));

我得到了异常

“反映类型 'Model.ONIX.editeur.ONIXMessage' 时出现错误。”

当我深入了解内部异常时,我会收到以下消息:

"{"无法使用 XmlText 属性对成员“文本”进行编码。你 可以使用 XmlText 属性来编码基元、枚举、 字符串数组,或 XmlNode 数组。"}"

我不知道该怎么办,XSD 有问题吗?有什么建议吗?!

编辑

public static List<Model.ONIX.editeur.Product> GetProductsDataFromOnixFile(string onixFileLocation)
    {
        var xmls = new XmlSerializer(typeof(Model.ONIX.editeur.ONIXMessageRefname));

        using (var reader = XmlReader.Create(onixFileLocation))
        {
            if (xmls.CanDeserialize(reader))
            {
                var onixMessage = (Model.ONIX.editeur.ONIXMessage)xmls.Deserialize(reader);
                return onixMessage.Items.OfType<Model.ONIX.editeur.Product>().ToList();
            }

            throw new Exception(string.Format("Cant read the file {0} as Onix", onixFileLocation));
        }
    }

【问题讨论】:

  • 你把哪个xsd变成了类(你的zip文件里有4个xsd)?
  • 从 XSD 创建的类之一。然而,这让我觉得我可能试图使用错误的类来初始化序列化程序
  • ONIX_BookProduct_3.0_reference
  • 我试图读取的文件是这样定义的:"editeur.org/onix/3.0/reference">" 如果使用 "Model.ONIX.editeur.ONIXMessageRefname" XmlSerializer 我没有得到反射异常。但我无法读取文件。

标签: c# xml xsd onix


【解决方案1】:

我知道这个问题很老,但我认为其他有特定 Onix 问题的人会遇到这个问题。

这是我如何让它工作的。

在参考 xsd 中有两个包含在顶部。在这里,我复制/粘贴了其他两个文件。

<xs:include schemaLocation="ONIX_BookProduct_CodeLists.xsd" />
<xs:include schemaLocation="ONIX_XHTML_Subset.xsd" />

即这些行在文件中被替换为相应的文件。

然后我做了

xsd ONIX_BookProduct_3.0_reference.xsd /classes

然后它会生成 .cs 文件。我在这里遇到的唯一问题是我必须从所有字段中删除一个文本属性,例如List147,但不是来自字符串的字段。例如。我不得不像这样从生成的代码中删除属性:

/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public List121 textscript {
    get {
        return this.textscriptField;

但不是来自这样的属性

/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public string Value {
    get {
        return this.valueField;

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 2010-09-20
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多