Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用XSD.exe从C#type生成XML模式,以便[XmlAttribute]属性映射到所需的XML属性?_C#_Xml_Xsd_Xml Serialization - Fatal编程技术网

如何使用XSD.exe从C#type生成XML模式,以便[XmlAttribute]属性映射到所需的XML属性?

如何使用XSD.exe从C#type生成XML模式,以便[XmlAttribute]属性映射到所需的XML属性?,c#,xml,xsd,xml-serialization,C#,Xml,Xsd,Xml Serialization,简单地说,当我使用XSD.exe(Visual Studio 2012附带)从此类生成XML模式文件时: [可序列化] 公共阶层人士 { [XmlAttribute] 公共字符串名称{get;set;} [XmlAttribute] 公共整数{get;set;} } 我得到的结果是: 请注意,在生成的架构中,年龄属性是按要求指定的(它具有use=“required”),而属性名不是 我使用XSD.exe的方式如下: xsd.exe Sample.exe /type:Person 其中Sa

简单地说,当我使用XSD.exe(Visual Studio 2012附带)从此类生成XML模式文件时:

[可序列化]
公共阶层人士
{
[XmlAttribute]
公共字符串名称{get;set;}
[XmlAttribute]
公共整数{get;set;}
}
我得到的结果是:


请注意,在生成的架构中,年龄属性是按要求指定的(它具有use=“required”),而属性名不是

我使用XSD.exe的方式如下:

xsd.exe Sample.exe /type:Person
其中Sample.exe是定义Person类的.NET程序集


我想以某种方式在类中指定哪些XmlAttribute属性是必需的,哪些不是必需的,以便XSD.exe可以从中自动生成模式。这可能吗?

除非XSD中有错误(不清楚您是否尝试了XSD.exe文档中描述的内容,特别是-现在我无法测试),否则答案是肯定的,您可以

在您的例子中,Name和Age之间的不同行为仅仅是因为字符串字段是可空的,而int字段不是(不知何故,我不相信
int?
会对您的情况产生影响,您仍然可以尝试它……)属性是不可空的(从XSD的角度来看),因此使用可选的

使用属性:从类生成XML架构文档

在以下两种情况中,Xsd.exe都不指定使用 属性,还原为默认值可选:

•存在遵循指定命名约定的额外公共布尔字段

•默认值通过类型为的属性分配给成员 System.Component.DefaultValueAttribute

如果这两个条件都不满足,Xsd.exe将生成use属性所需的值


FWIW,XSD.EXE不是一个很好的工具。微软在几年前就停止了它的工作,我仍然发现它偶尔会出现错误。你能推荐一个替代工具吗?每当我在C#代码中更改XML可序列化类时,我希望自动生成XSD文件(在project post build事件中)。很好。如果你想要一个免费的工具,你可以试试这个:谢谢你的建议。实际上,我需要从C#代码(或者更一般地说,从.NET type/class)生成XSD文件。使用指定的工具可以实现这一点吗?我刚刚检查过,这篇文章是关于从XML而不是从C#类生成XSD的。这并不能解决我的问题,但感谢您的努力,我很感激。实际上,我更需要的是将“Name”(上面类中的字符串属性)作为XML文件中元素的必需属性。你把注意力集中在你答案中的整数上,并把它变成可选的,这很好。但是,我不知道如何使映射到XSD文件的类的string属性在XSD.exe生成的模式中具有use=“required”。有什么想法吗?如果您浏览提供的链接,您可能会注意到XmlAttributeAttribute如何用于引用类型(字符串就是其中之一)。结论是,对于引用类型,没有办法强制使用use=required(至少我可以推断或知道)。换句话说,对于引用类型(XSD到代码,代码到XSD),XSD和XSD.exe生成的代码之间无法正确往返。