2009-08-04 11 views
3

VSTS2008 + C#+ .Net 3.0を使用しています。私はXMLをシリアライズするために以下のコードを使用しています。ここに私の現在のコードとシリアライズされたXMLファイルがあります。私の目的は、MyInnerObjectPropertiesを特別なXML名前空間(http://foo/2009)に所属させ、この名前空間を既定の名前空間にすることです。どのようにこれを実装するためのアイデア?XMLシリアル化を使用して別のXML名前空間にプロパティを配置する

電流出力:

<?xml version="1.0"?> 
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MyObjectProperty> 
    <MyInnerObjectProperties> 
     <MyInnerObjectProperty> 
     <ObjectName>Foo Type</ObjectName> 
     </MyInnerObjectProperty> 
     <MyInnerObjectProperty> 
     <ObjectName>Goo Type</ObjectName> 
     </MyInnerObjectProperty> 
    </MyInnerObjectProperties> 
    </MyObjectProperty> 
</MyClass> 

現在のコード:

public class MyClass 
{ 
    private MyObject[] _myObjectProperty; 

    [XmlElement(IsNullable=false)] 
    public MyObject[] MyObjectProperty 
    { 
     get 
     { 
      return _myObjectProperty; 
     } 
     set 
     { 
      _myObjectProperty = value; 
     } 
    } 
} 
public class MyObject 
{ 
    private MyInnerObject[] _myInnerObjectProperty; 

    [XmlArrayItemAttribute("MyInnerObjectProperty", typeof(MyInnerObject), IsNullable=false)] 
    public MyInnerObject[] MyInnerObjectProperties 
    { 
     get 
     { 
      return _myInnerObjectProperty; 
     } 
     set 
     { 
      _myInnerObjectProperty = value; 
     } 
    } 
} 

public class MyInnerObject 
{ 
    public string ObjectName; 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     XmlSerializer s = new XmlSerializer(typeof(MyClass)); 
     FileStream fs = new FileStream("foo.xml", FileMode.Create); 
     MyClass instance = new MyClass(); 
     instance.MyObjectProperty = new MyObject[1]; 
     instance.MyObjectProperty[0] = new MyObject(); 
     instance.MyObjectProperty[0].MyInnerObjectProperties = new MyInnerObject[2]; 
     instance.MyObjectProperty[0].MyInnerObjectProperties[0] = new MyInnerObject(); 
     instance.MyObjectProperty[0].MyInnerObjectProperties[0].ObjectName = "Foo Type"; 
     instance.MyObjectProperty[0].MyInnerObjectProperties[1] = new MyInnerObject(); 
     instance.MyObjectProperty[0].MyInnerObjectProperties[1].ObjectName = "Goo Type"; 

     s.Serialize(fs, instance); 

     return; 
    } 
} 
+1

ジョージ、ときは、.NET 3.5 SP1の使用を停止しましたか? –

+0

ジョン、私はいくつかのプロジェクトに取り組んでいます。それらのいくつかはスクラッチから開発されており、私は.Net 3.5 SP1 + .Net 2.0 SP2を使用します。従来のプロジェクトでは、元の.Netバージョンをそのまま使用します。 .NET 3.0ベースのプロジェクトでLINQを使用できないのは残念です。どのような方法でも、私の質問のための任意のアイデア? – George2

+0

私はそれに取り組んでいます。誰かが私の前に答えを持っているだろう、私は確信している。 –

答えて

1

あなたはXmlSerializerNamespacesオブジェクトを作成し、そこにあなたの必要な名前空間を追加する必要があります。

XmlSerializerNamespacesオブジェクトには、XmlSerializerがXMLドキュメントインスタンスで修飾名を生成するために使用するXML名前空間とプレフィックスが含まれています。あなたのC#コードで

XmlSerializerNamespaces myNameSpaces = new XmlSerializerNamespaces(); 
myNameSpaces.Add("MyInnerObject", "http://foo/2009"); 

次に、このように、あなたのクラスに属性を追加します。

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializernamespaces.aspx

+0

ありがとうロバート。私の目的は、MyClassクラスのすべてを統一された名前空間に追加するのではなく、MyInnerObjectProperties要素を名前空間 "http:// foo/2009"に追加することです。あなたの解決策は、クラス「MyClass」のすべての要素を「http:// foo/2009」に追加すると思いますか?私の問題にどのようなアイデア? – George2

+1

クラス全体で使用する必要はありません。必要な要素と属性を選択して選択できます。詳細はhttp://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializernamespaces.aspx –

+1

を参照してください。あなたの質問にもっと近づけるように私の答えを編集しました。 –

2

方法について:で

public class MyInnerObject 
{ 
[XmlElement(Namespace = "http://foo/2009")] 

さらに詳しい情報これは:

[XmlArrayItemAttribute(Namespace = "http://foo.com/2009" /* other attr. params. */)] 
public MyInnerObject[] MyInnerObjectProperties 
{ 
    get { ... } 
    set { ... } 
} 
+0

働く、クール!ありがとう! – George2

2

は私にとって

public class MyObject 
{ 
    [XmlArrayItemAttribute("MyInnerObjectProperty", typeof (MyInnerObject), 
     IsNullable = false)] 
    [XmlArray(Namespace = "http://foo.com/2009")] 
    public MyInnerObject[] MyInnerObjectProperties { get; set; } 
} 

を試してみて、これは生産:

<?xml version="1.0" encoding="utf-8"?> 
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MyObjectProperty> 
     <MyInnerObjectProperties xmlns="http://foo.com/2009"> 
      <MyInnerObjectProperty> 
       <ObjectName>Foo Type</ObjectName> 
      </MyInnerObjectProperty> 
      <MyInnerObjectProperty> 
       <ObjectName>Goo Type</ObjectName> 
      </MyInnerObjectProperty> 
     </MyInnerObjectProperties> 
    </MyObjectProperty> 
</MyClass> 
+1

+1これも私が考えていたものです。 –

関連する問題