1

我有一个 xsd,我想以某种方式序列化。我可以通过以下方式实现我想要的,但问题是,xsd2code 生成了一个在任何地方都完全未使用的额外类。我做错了吗?我还缺少另一个技巧吗?

<xsd:schema 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" >

    <xsd:element name="UITranslatorConfiguration" >
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="Queries" minOccurs="0" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="Queries">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="Query" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="Query">
        <xsd:complexType>
            <xsd:simpleContent>
                <xsd:extension base="xsd:string">
                    <xsd:attribute name="QueryID" type="xsd:string" />
                </xsd:extension>
            </xsd:simpleContent>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

我想要的xml输出:

<UITranslatorConfiguration>
    <Queries>
        <Query QueryID="queryID1">someQueryText</Query>
        <Query QueryID="queryiq2">someQueryText2</Query>
        <Query QueryID="queryiq3">someQueryText3</Query>
    </Queries>
<UITranslatorConfiguration>

它生成的代码:

这可以:

[System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "3.4.0.38968")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class UITranslatorConfiguration {

    [EditorBrowsable(EditorBrowsableState.Never)]
    private List<Query> queriesField;

    private static System.Xml.Serialization.XmlSerializer serializer;

    public UITranslatorConfiguration() {
        this.queriesField = new List<Query>();
    }

    [System.Xml.Serialization.XmlArrayAttribute(Order=0)]
    [System.Xml.Serialization.XmlArrayItemAttribute("Query", IsNullable=false)]
    public List<Query> Queries {
        get {
            return this.queriesField;
        }
        set {
            this.queriesField = value;
        }
    }
}

这可以:

[System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "3.4.0.38968")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class Query {

    [EditorBrowsable(EditorBrowsableState.Never)]
    private string queryIDField;

    [EditorBrowsable(EditorBrowsableState.Never)]
    private string valueField;

    private static System.Xml.Serialization.XmlSerializer serializer;

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string QueryID {
        get {
            return this.queryIDField;
        }
        set {
            this.queryIDField = value;
        }
    }

    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value {
        get {
            return this.valueField;
        }
        set {
            this.valueField = value;
        }
    }
}

这不好。这是从哪里来的,为什么?它根本不在任何地方使用。如何使 xsd2code 不生成此类。

[System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "3.4.0.38968")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class Queries {

    [EditorBrowsable(EditorBrowsableState.Never)]
    private List<Query> queryField;

    private static System.Xml.Serialization.XmlSerializer serializer;

    public Queries() {
        this.queryField = new List<Query>();
    }

    [System.Xml.Serialization.XmlElementAttribute("Query", Order=0)]
    public List<Query> Query {
        get {
            return this.queryField;
        }
        set {
            this.queryField = value;
        }
    }
}
4

2 回答 2

0

我对生成的代码有类似的“问题”(例如,难看的字段名称等)。我最终创建了漂亮而干净的实体类,并使用AutoMapper从生成的类中的数据初始化它们。这意味着我不必直接处理生成的类,它还提供了一个反腐败层。即使生成的类具有世界上最漂亮的代码,这也是我的建议,只是为了保护您的应用程序免受架构中任何意外更改的影响。

但是,我刚刚在我的版本xsd2code(3.5.3 直接从源代码构建,带有一些额外的补丁来解决我遇到的各种问题)中对此进行了测试,并确认这种行为仍在发生。我建议您在xsd2code 站点上打开一个问题,但不幸的是,似乎并没有太多关注修复它们(我已经提交了几个尚未实施的补丁),所以我不希望任何时候都能修复很快。值得庆幸的是,您已经能够解决它。

于 2012-11-23T03:15:30.383 回答
0

您的架构包含显式的“查询”元素。这导致了类的生成。要实现没有“查询”类的代码集,只需将查询元素的类型指定为 type="Query"。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLSchema1"
    targetNamespace="http://tempuri.org/XMLSchema1.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>

  <xs:element name="UITranslatorConfiguration">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Queries" type="Query" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="Query">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="QueryID" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

</xs:schema>

这将产生所需的结果,如图所示

namespace Schemas1
{
    using System;
    using System.Diagnostics;
    using System.Xml.Serialization;
    using System.Collections;
    using System.Xml.Schema;
    using System.ComponentModel;
    using System.Collections.Generic;


    public partial class UITranslatorConfiguration
    {

        private List<Query> queriesField;

        public UITranslatorConfiguration()
        {
            this.queriesField = new List<Query>();
        }

        public List<Query> Queries
        {
            get
            {
                return this.queriesField;
            }
            set
            {
                this.queriesField = value;
            }
        }
    }

    public partial class Query
    {

        private string queryIDField;

        private string valueField;

        public string QueryID
        {
            get
            {
                return this.queryIDField;
            }
            set
            {
                this.queryIDField = value;
            }
        }

        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = value;
            }
        }
    }
}

根据我将 xsd 文件转换为自动生成的类(无论工具如何)的经验,我发现最好尽可能避免使用“ref”,而在这些情况下直接使用该类型。

希望这可以帮助。

于 2013-11-13T03:45:41.227 回答