我有一个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;
}
}
}
答案 0 :(得分:0)
我对生成的代码有类似的“问题”(例如,丑陋的字段名称等)。我最终创建了漂亮而干净的实体类,并使用AutoMapper从生成的类中的数据初始化它们。这意味着我不必直接处理生成的类,它还提供了anti corruption layer。即使生成的类具有世界上最漂亮的代码,这也是我的建议,只是为了保护您的应用程序免受模式中任何意外更改的影响。
但是,我刚刚在我的xsd2code
版本中测试了这个(3.5.3直接从源代码构建了一些额外的修补程序以修复我遇到的各种问题),并确认此行为仍然存在发生。我建议你在xsd2code site打开一个问题,但遗憾的是似乎没有太多关注修复它们(我已经提交了几个尚未实现的补丁),所以我不指望很快修复。谢天谢地,你已经能够解决它。
答案 1 :(得分:0)
您的架构包含显式“查询”元素。这导致了类的生成。要实现不带“Queries”类的代码集,只需将Queries元素的类型指定为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”,而是在这些情况下直接使用类型。
希望这有帮助。