2017-08-09 14 views
1

.NET XmlSerializerを使用して、C#WindowsフォームアプリケーションでオブジェクトをXMLドキュメントにシリアル化しています。 (xsd.exeによって作成された部分クラスに参加するには)、私はxsi:noNamespaceSchemaLocation属性を追加するには、次のプロパティを追加したxmlns:xsd属性を削除する方法xmlns:xsiを維持する

部分クラスで
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="file:///C:/data//MySchema.xsd"> 
    <!-- ... --> 
</root> 

ルート要素は、のように見える終わる必要があります。

[XmlAttribute("noNamespaceSchemaLocation", Namespace = XmlSchema.InstanceNamespace)] 
public string xsiNoNamespaceSchemaLocation = @"file:///C://data//MySchema.xsd"; 

そして、他のすべての名前空間を削除しますが、私が使用している xsi 1を維持する:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 

そしてはXmlSerializer.Serialize()メソッドにnsを可決しました。

これまでのところ動作しますが、これが正しいかどうかはわかりません。それは私がデフォルトでそこにあるものを取り除いているように感じます、ただそれをもう一度追加してみてください...コードのにおいのようです。

xsdを削除するだけの良い方法はありますか?デフォルトのxsiのままにしておくと、もう一度追加する必要はありません。

注:この上の未回答の質問はhereが戻っていくつかの時間から既に存在し、それは両方xsdxsi属性を削除すると、唯一の提案答えは似合いません。

+2

あなたがしたことが私には正しいと思われます。内部を見れば、 'XmlSerializer'は何も指定されていなければ[DefaultNamespaces'](http://referencesource.microsoft.com/#System.Xml/System/Xml/Serialization/XmlSerializer.cs,34e80c7c306a0313)を使用しています。これがデフォルトで 'xsi'と' xsd'を見る理由です。 –

+0

@CharlesMagerありがとう、私は名前空間の追加を調整することができたことを見てくれた: 'ns.Add(" xsi "、XmlSchema.InstanceNamespace);' – Toby

+1

@CharlesMagerはあなたのコメントがFWIWあなたがそれを答えにしたいなら、私はそれを受け入れます。 – Toby

答えて

1

あなたのしたことは私には正しいと思われます。

XmlSerializerは、指定がない場合はDefaultNamespacesを使用しています。あなたはxsixsdのための接頭辞/名前空間を含む供給とXmlSerializerNamespacesにした、あなたは、デフォルトでxsixsdの宣言を参照してください理由であるかのように

これは同じです。

xsdを「削除」する正しいことは、その接頭辞/名前空間を含まないXmlSerializerNamespacesインスタンスを指定することです。

0

私もあなたのような問題が発生しました。最初にlinqを使用しましたが、動作しませんでした。後で私は良いツールを見つけましたXSLTOnlineのようにXSLTを使用できます。