2011-07-29 11 views
0

私はクラスを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]属性のようなものは完璧です。

答えて

0

XMLシリアル化は、データをシリアル化するためのものです。 schemaLocationがデータの一部である場合は、スキーマ内で使用します。それがあなたのデータにないなら、あなたはそれをシリアライズするべきではありません。

schemaLocationは、スキーマを参照したいツールのヒントにすぎないことに注意してください。多くの場合、これは必須ではありません(Visual Studioなど)。

+0

データをserializeするときに、schemaLocationがxsi:schemaLocation = "MyNameSpace MyNameSpace.xsd"というXMLファイルに正しく表示されます。 問題は、schemaLocationを自分のXSDスキーマの一部とみなすべきではなく、(XmlSchema.InstanceNamespaceを介して)インポートされたスキーマの一部でなければならないということです。 誰かがシリアル化されたデータを編集しているのにintelisenseが動作しないようにするには、私の場合は必要です。 – row1

+0

あなたは間違っています。 Intellisenseは、スキーマファイルが同じプロジェクトにある場合、または使用するスキーマを「手動で」設定した場合に機能します。もう一度、あなたはそれを両方の方法で持つことはできません。 –

+0

これらのファイルはプロジェクトに存在しないため、Intellisenseはスキーマの場所なしでは機能しません。私は構成エンジニアがVisual Studioのリモートサーバーでこのファイルを開いて編集する必要があります。手動でスキーマを選択する必要がある場合は面倒です。私がリンクした答えは、スキーマの場所の使い方がシリアライゼーションに適していると言うので、XSDの生成にはうまくいかないというのは残念です。 – row1

関連する問題