2017-10-04 8 views
1

xml configsを読み書きするコンフィギュレータを作成する必要があります。設定の 一部は、次の形式である:2つのシステム属性のいずれかを選択してください。

<camera> 
    <id>1</id> 
    <name>Camera 1</name> 
    <address>http://192.168.1.100</address> 
    <roi> 
     <rect> 
      <x>100</x> 
      <y>200</y> 
      <width>300</width> 
      <height>150</height> 
     </rect> 
     <rect> 
      <x>350</x> 
      <y>400</y> 
      <width>200</width> 
      <height>250</height> 
     </rect> 
    </roi> 
</camera> 

しかし、XML属性を持つ形で、私は必要な出力:

<camera id="1" name="Camera 1" address="http://192.168.1.100"> 
    <roi> 
     <rect x="100" y="200" width="300" height="150 /> 
     <rect x="350" y="400" width="200" height="250 /> 
    </roi> 
</camera> 

私はすべてのメインノードのクラスを作成しますが、私はどのように思っていました逆シリアル化のプロパティがXmlElementでなければならず、直列化の場合はXmlAttributeである必要があります。または、私はxmlの最初の形式と2番目の形式の2つの別々のクラスを作成していますか?私はC#と.NETの初心者ですので、他の方法でそれを行うためのポイントや提案もありますか?

C#コード:

[System.Serializable()] 
public class CamerasConfigAttrib 
{ 
    private int id; 
    private string name; 
    private string address; 
    private Collection<Rectangle> roi; 

    [XmlAttribute("id", Form = XmlSchemaForm.Unqualified)] 
    public int Id 
    { 
     get { return id; } 
     set { id = value; } 
    } 

    [XmlAttribute("name", Form = XmlSchemaForm.Unqualified)] 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    [XmlAttribute("address", Form = XmlSchemaForm.Unqualified)] 
    public string Address 
    { 
     get { return address; } 
     set { address = value; } 
    } 

    [XmlArray("roi", Form = XmlSchemaForm.Unqualified)] 
    [XmlArrayItem("rect", typeof(Rectangle), Form = XmlSchemaForm.Unqualified] 
    public Collection<Rectangle> Roi 
    { 
     get { return roi; } 
     set 
     { 
      foreach (var rect in value) 
       roi.Add(rect); 
     } 
    } 
} 
+0

少し複雑だ、私はあなたが2つの異なるクラスを作るために持っていると思うが、それを行うには良い方法があれば、それは私に興味 – GGO

+0

XSLTを作成し、新しいXMLを作成するために 'XslCompiledTransform'を使うべきです。 – Sefe

答えて

0

使用XmlAttributeOverridesは、別の構造(あなたはまた、デシリアライズするためにそれを使用することができます)に異議シリアル化します。ここでは、あなたの場合はそれを使用することができますどのように短いサンプルです:

[Serializable] 
[XmlRoot("camera")] 
public class CamerasConfigAttrib : IXmlSerializable 
{ 
    [XmlElement("id")] 
    public int Id { get; set; } 

    [XmlElement("name")] 
    public string Name { get; set; } 
} 

プロセスコード:

// sample data 
var xml = @"<camera><id>1</id><name>Camera 1</name></camera>"; 
// deserialization according to a native attributes 
var camera = (CamerasConfigAttrib)new XmlSerializer(typeof(CamerasConfigAttrib)) 
       .Deserialize(new StringReader(xml)); 
// prepare overridings 
var overrides = new XmlAttributeOverrides(); 
overrides.Add(typeof (CamerasConfigAttrib), "Id", 
    new XmlAttributes 
    { 
     XmlAttribute = new XmlAttributeAttribute("Id") 
    }); 
overrides.Add(typeof(CamerasConfigAttrib), "Name", 
    new XmlAttributes 
    { 
     XmlAttribute = new XmlAttributeAttribute("name") 
    }); 
// serializer initiated with overridings 
var s = new XmlSerializer(typeof(CamerasConfigAttrib), overrides); 
var sb = new StringBuilder(); 
s.Serialize(new StringWriter(sb), camera); 

結果

<?xml version="1.0" encoding="utf-16"?> 
<camera xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Id="1" name="Camera 1" /> 

はこの方法がより自然である私には思える、とのdoesn追加のクラスやファイルが必要です。

あなたがインターフェイスIXmlSerializableを実装することができます別の方法として、それはより多くの柔軟性が得られますが、それは

関連する問題