【问题标题】:Serialise to XML and XSD with Schema Location Results in Invalid XSD.使用架构位置序列化为 XML 和 XSD 导致 XSD 无效。
【发布时间】:2011-10-15 15:30:21
【问题描述】:

我正在使用 .NET 3.5 将类序列化为 Xml 并创建 XSD 架构。生成的 XML 使用架构位置属性引用 XSD。

我的解决方案基于以下答案: XmlSerialization and xsi:SchemaLocation (xsd.exe)XML Serialization and Schema without xsd.exe

我向我的类添加一个属性来引用 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" />

当我尝试在 Visual Studio 中编辑我的序列化 XML 文件时,由于上述属性,自动完成功能不起作用并给出以下错误:

http://www.w3.org/2001/XMLSchema-instance:schemaLocation”属性未声明。

我目前从 XSD 中删除架构位置属性的解决方案是以下 hack:

    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] 属性这样的东西会很完美。

【问题讨论】:

    标签: c# xml xml-serialization xsd


    【解决方案1】:

    XML 序列化旨在序列化您的数据。如果 schemaLocation 是您的数据的一部分,那么您希望它在您的架构中。如果它不在您的数据中,那么您不应该对其进行序列化。

    请记住,schemaLocation 只是对想要引用架构的工具的提示。在很多情况下(例如,Visual Studio)没有必要。

    【讨论】:

    • 当我序列化我的数据 schemaLocation 时,XML 文件中正确显示为 xsi:schemaLocation="MyNameSpace MyNameSpace.xsd"。问题是 schemaLocation 不应被视为我的 XSD 架构的一部分,它应该是导入架构的一部分(通过 XmlSchema.InstanceNamespace)。如果有人正在编辑我的序列化数据,我希望智能感知在 Visual Studio 中工作,没有 schemaLocation 智能感知不起作用,所以在我的情况下是必要的。
    • 你错了。如果架构文件在同一个项目中,或者如果您“手动”设置要使用的架构,Intellisense 将起作用。同样,你不能同时拥有它。
    • 这些文件在项目中不存在,因此 Intellisense 在没有架构位置的情况下无法工作。我希望配置工程师在 Visual Studio 的远程服务器上打开这个文件并编辑它,如果他们必须手动选择架构很麻烦。我链接到的答案说我对模式位置的使用对于序列化是正确的,所以不幸的是它似乎不适用于 XSD 生成。
    • 那些答案是只有在你不需要架构的情况下才会“工作”的技巧。如果您不愿意创建自己的 XmlWriter 子类,那么您可以覆盖根元素的生成以包含 schemaLocation 属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多