XmlSchemaInference推断UInt32属性为xsd:unsignedByte的原因咨询
问题原因
XmlSchemaInference的类型推断逻辑是基于XML实例中的实际数据值,而非原始CLR类型。如果你的class.xml里u32Value的取值范围在0-255之间(unsignedByte的覆盖范围),它会优先推断为更精确的xsd:unsignedByte,而非你预期的xsd:unsignedInt。- 微软文档《Mapping XML Data Types to CLR Types》描述的是正向映射规则:将CLR类型序列化到XML Schema时的默认对应关系(比如用
XmlSchemaExporter生成Schema),但你当前用的是反向推断(从XML实例推导Schema),两者逻辑完全不同。
解决办法
- 修改XML实例数据:在
class.xml里给u32Value设一个超过255的值(比如256),XmlSchemaInference就会自动推断为xsd:unsignedInt。 - 调整推断规则:启用宽松推断模式,让工具优先选择更宽泛的类型:
XmlReader reader = XmlReader.Create("class.xml"); XmlSchemaSet schemaSet = new XmlSchemaSet(); XmlSchemaInference schema = new XmlSchemaInference(); schema.TypeInference = XmlSchemaInference.InferenceOption.Relaxed; schemaSet = schema.InferSchema(reader);
- 直接从CLR类生成Schema:如果你的目标是从C#类生成对应XSD,建议跳过XML实例,直接用
XmlSerializer生成,这样能严格遵循官方的类型映射:
XmlSerializer serializer = new XmlSerializer(typeof(YourClass)); XmlSchemaSet schemaSet = new XmlSchemaSet(); serializer.GenerateSchema(schemaSet, null); foreach (XmlSchema schema in schemaSet.Schemas()) { schema.Write(File.CreateText("output.xsd")); }
内容的提问来源于stack exchange,提问作者TollMan
相关产品推荐
相关产品推荐

