序列化到XML和XSD时,模式位置导致无效XSD

本文关键字:XSD 位置 无效 模式 XML 序列化 | 更新日期: 2023-09-27 18:04:07

我使用。net 3.5将一个类序列化为Xml并创建一个XSD模式。生成的XML使用模式位置属性引用XSD。

我的解决方案是基于这些答案:XmlSerialization和xsi:SchemaLocation (xsd.exe)和不使用xsd.exe的XML序列化和模式

我在类中添加了一个属性来引用XSD:

[XmlAttribute("schemaLocation", Namespace = XmlSchema.InstanceNamespace)]
public string XsiSchemaLocation = "MyNameSpace " + "MyNameSpace.xsd";
问题是XsiSchemaLocation字段最终出现在我的XSD文件中:
<xs:attribute xmlns:q1="http://www.w3.org/2001/XMLSchema-instance" ref="q1:schemaLocation" />

当我尝试编辑我的序列化XML文件自动完成在Visual Studio不工作,因为上述属性,并给出以下错误:

没有声明'http://www.w3.org/2001/XMLSchema-instance:schemaLocation'属性。

我目前从XSD中删除模式位置属性的解决方案如下:

    XmlReflectionImporter importer = new XmlReflectionImporter();
    XmlSchemas schemas = new XmlSchemas();
    XmlSchemaExporter exporter = new XmlSchemaExporter(schemas);
    XmlTypeMapping map = importer.ImportTypeMapping(m_SerializedType);
    exporter.ExportTypeMapping(map);
    using (var tw = new StreamWriter(m_XsdPath))
    {
        //Hack to remove the schema location from the XSD.
        ((System.Xml.Schema.XmlSchemaComplexType)(schemas[0].Items[1])).Attributes.Clear();
        schemas[0].Write(tw);
    }

有比强制删除属性更好的方法吗?像[XmlSchemaIgnore]这样的属性将是完美的。

序列化到XML和XSD时,模式位置导致无效XSD

XML序列化意味着序列化您的数据。如果schemaLocation是数据的一部分,那么您希望它在模式中。如果它不在你的数据中,那么你就不应该序列化它。

请记住,schemaLocation只是想要引用模式的工具的提示。在很多情况下(例如Visual Studio),这是不必要的。