2

オブジェクトがある場合:-

class c { List<b> b; }

class b { string a; }

cをXMLに変換すると、結果は次のようになります:-

<c> <b> <b> <a>Hello</a> </b>...

レイヤーの1つを取り除くことができるように、コード構造またはオプションのいずれかを使用してXMLをフラット化する方法はありますか?私は最終的にXMLをただにしたいと思っています:-

<c> <b> <a>Hello</a> </b>....

または問題を調べる別の方法、どのように逆シリアル化できますか:-

<c><b><a>Name</a></b><b><a>Age</a></b></c>

C#クラス構造に?

前もって感謝します?不可能な場合はお知らせください。

4

2 に答える 2

0

1つのオプションは、IXmlSerializableを実装して、クラスのXMLシリアル化がどのような形式をとるべきかを正確に制御できるようにすることです。

または、 XMLシリアル化を制御する属性でクラスとプロパティを装飾する必要がない場合もあります。

于 2012-11-30T11:12:15.430 に答える
-1

これが必要な場合:

<ArrayOfB>
     <b>
          <a>Name</a>
     </b>
     <b>
          <a>Age</a>
     </b>
</ArrayOfB>

その後、これは機能するはずです。

public class XMLPlayground
{
    public void Play()
    {
        List<b> list = new List<b>()
        {    
            new b() {a = "Name"}, 
            new b() {a = "Age"}, 
        };
        string str = SerializeToString(list);
        Console.WriteLine(str); 
    }

    private string SerializeToString(object o)
    {
        if (o == null) return "";
        var xs = new XmlSerializer(o.GetType());

        XmlSerializerNamespaces tellTheSeriliserToIgnoreNameSpaces = new XmlSerializerNamespaces();
        tellTheSeriliserToIgnoreNameSpaces.Add(String.Empty, String.Empty);
        XmlWriterSettings tellTheWriterToOmitTheXmlDeclaration = new XmlWriterSettings { OmitXmlDeclaration = true };

        using (StringWriter writer = new StringWriter())
        {
            using (var xw = XmlWriter.Create(writer, tellTheWriterToOmitTheXmlDeclaration))
            {
                xs.Serialize(xw, o, tellTheSeriliserToIgnoreNameSpaces);
                return writer.ToString();
            }
        }
    }
}

[Serializable]
public class b
{
    public string a { get; set; }
}

ここにあなたが達成したいことについての洞察がありますが、私には解決策はかなり難解に見えます。XmlTextReaderを使用してSAXアプローチを試し、その場でオブジェクトを作成することをお勧めします。

C#Xmlのシリアル化、コレクション、ルート要素

于 2012-11-30T11:24:39.430 に答える