私はクラスをXMLにシリアル化し、XSDスキーマを作成するために.NET 3.5を使用しています。生成されたXMLは、スキーマ位置属性を使用してXSDを参照します。スキーマの場所を指定してXMLとXSDにシリアル化すると、無効な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" />
シリアル化されたXMLファイルを編集しようとするとオートコンプリートVisual Studioでは、上記理由属性の仕事と、以下のエラー与えていません:
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);
}
:XSDからスキーマの場所属性がハックの下で削除する
The ' http://www.w3.org/2001/XMLSchema-instance:schemaLocation ' attribute is not declared.
私の現在のソリューションを
属性を強制的に削除するよりも良い方法はありますか? [XmlSchemaIgnore]属性のようなものは完璧です。
データをserializeするときに、schemaLocationがxsi:schemaLocation = "MyNameSpace MyNameSpace.xsd"というXMLファイルに正しく表示されます。 問題は、schemaLocationを自分のXSDスキーマの一部とみなすべきではなく、(XmlSchema.InstanceNamespaceを介して)インポートされたスキーマの一部でなければならないということです。 誰かがシリアル化されたデータを編集しているのにintelisenseが動作しないようにするには、私の場合は必要です。 – row1
あなたは間違っています。 Intellisenseは、スキーマファイルが同じプロジェクトにある場合、または使用するスキーマを「手動で」設定した場合に機能します。もう一度、あなたはそれを両方の方法で持つことはできません。 –
これらのファイルはプロジェクトに存在しないため、Intellisenseはスキーマの場所なしでは機能しません。私は構成エンジニアがVisual Studioのリモートサーバーでこのファイルを開いて編集する必要があります。手動でスキーマを選択する必要がある場合は面倒です。私がリンクした答えは、スキーマの場所の使い方がシリアライゼーションに適していると言うので、XSDの生成にはうまくいかないというのは残念です。 – row1