2017-12-11 48 views
0
[XmlRoot("A")] 
public class Foos 
{ 
    [XmlElement("A1")] 
    public List<Foo> FooList{ get; set; } 
} 


var serializer = new XmlSerializer(typeof(Foos)); 

このコードも同様に機能します。しかし、それは動的ではありません。 [XmlRoot("A")][XmlRoot(ConfigurationManager.AppSettings[someValue])]がほしいです。しかし、構文エラーにスローされます。それから私はこれを試してくださいXmlElementの名前を動的に変更するにはどうすればよいですか?

public class Foos 
    { 
     [XmlElement("A1")] 
     public List<Foo> FooList{ get; set; } 
    } 
var serializer = new XmlSerializer(typeof(Foos),new XmlRootAttribute(ConfigurationManager.AppSettings[someValue])); 

これは単なるルート要素です。私は働いています。私はFooListの "XmlElement"値を動的に変更することができませんでした。クラス内に複数の要素が存在する可能性があります。それらのすべてのXmlElement値を動的に変更するにはどうすればよいですか?

+1

@BassemAklだけのルート要素のある設定。私はこれを書いた。 "これはルート要素だけで動作する"。しかし、私は内部クラスの要素が欲しいです。 –

+0

私の間違い。私はコメントを取った。 –

答えて

1

XmlAttributesOverridesを適切に使用する必要があります。 Please Check

コードのワーキングバージョンはこちらです。

public class Foos 
{  
    public List<Foo> FooList { get; set; } 
} 


public class Foo 
{ 
    public string Name { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 

     var xmlAttributeForFoos = new XmlAttributes { XmlRoot = new XmlRootAttribute(ConfigurationManager.AppSettings["someFoosValue"]), XmlType = new XmlTypeAttribute(ConfigurationManager.AppSettings["someFoosValue"]) }; 
     var xmlAttributeForFooList = new XmlAttributes(); 
     var xmlAttributeForFoo = new XmlAttributes(); 

     xmlAttributeForFooList.XmlElements.Add(new XmlElementAttribute(ConfigurationManager.AppSettings["someFooValue"])); 
     xmlAttributeForFoo.XmlElements.Add(new XmlElementAttribute(ConfigurationManager.AppSettings["someFooNameValue"])); 

     var overrides = new XmlAttributeOverrides(); 
     overrides.Add(typeof(Foos), xmlAttributeForFoos); 
     overrides.Add(typeof(Foos), "FooList", xmlAttributeForFooList); 
     overrides.Add(typeof(Foo), "Name", xmlAttributeForFoo); 

     XmlSerializer serializer = new XmlSerializer(typeof(Foos), overrides); 

     var foos = new Foos 
     { 
      FooList = new List<Foo> 
      { 
       new Foo{Name = "FooName"} 
      } 
     }; 

     using (var stream = File.Open("file.xml", FileMode.OpenOrCreate)) 
     { 
      serializer.Serialize(stream, foos); 
     } 
    } 
} 

のAppは

<appSettings> 
    <add key="someFoosValue" value="SomeFoos"/>  
    <add key="someFooValue" value="SomeFoo"/> 
    <add key="someFooNameValue" value="FooName"/> 
</appSettings> 

出力

<SomeFoos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <SomeFoo> 
    <FooName>FooName</FooName> 
    </SomeFoo> 
</SomeFoos> 
+0

ありがとうございます。 –

+0

@MuhammetCanTONBUL、私はあなたが望むコードを正確に変更しました。私はあなたがすでに解決策を見つけたと思うが、それを保つ方が良い。 –

+1

いいですね、もう一度ありがとうございます。 –