0

複数レコードのフラットファイルをxmlに変換しようとしています。レコードタイプごとに個別のクラスがあります。一部のクラスにはインスタンスが1つしかないため、「クラスノード」で区切る必要はありません。いくつかは複数回発生し、分離する必要があります。xmlシリアライザーを使用しているときにクラス名を無視/削除する方法が見つかりません。

public class Class1
{
    public string StringA;
    public string StringB;
    public string StringC;

}
public class Class2
{
    public string StringD;
    public string StringE;
    public string StringF;
}
 public class Class3
{
    public string Name;
    public Class1 User1 = new Class1 { StringA = "A String", StringB = "B String", StringC = "C String" };
    public Class2 User2 = new Class2 { StringD = "D String", StringE = "E String", StringF = "F String" };

}

シリアル化は次のとおりです。

XmlSerializer x = new XmlSerializer(typeof(Class3));
var test = new Class3();
test.Name = "Name";
x.Serialize(Console.Out, test);

私は次のようになります:

<Class3>
<Name>Name</Name> 
<User1>
  <StringA>A String</StringA> 
  <StringB>B String</StringB> 
  <StringC>C String</StringC> 
</User1>
<User2>
  <StringD>D String</StringD> 
  <StringE>E String</StringE> 
  <StringF>F String</StringF> 
</User2>

とノードが消えて次のようになるようにします。

<Class3>
  <Name>Name</Name>
  <StringA>A String</StringA>
  <StringB>B String</StringB>
  <StringC>C String</StringC>
  <StringD>D String</StringD>
  <StringE>E String</StringE>
  <StringF>F String</StringF>
</Class3>
4

1 に答える 1

-1

最も簡単で柔軟な方法は、IXmlSerializable を実装することです (少なくとも Class3 では)。

これをチェックしてみてください: http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly

public class Class3 : IXmlSerializable
{
    public string Name;
    public Class1 User1 = new Class1 
    {
        StringA = "A String",
        StringB = "B String",
        StringC = "C String"
    };

    public Class2 User2 = new Class2
    {
        StringD = "D String",
        StringE = "E String",
        StringF = "F String"
    };

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {

    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteElementString("Name", Name);
        writer.WriteElementString("StringA", User1.StringA);
        writer.WriteElementString("StringB", User1.StringB);
        writer.WriteElementString("StringC", User1.StringC);

        writer.WriteElementString("StringD", User2.StringD);
        writer.WriteElementString("StringE", User2.StringE);
        writer.WriteElementString("StringF", User2.StringF);

    }
于 2013-01-29T23:18:52.640 に答える