0

ねえみんなここでC#.net 4MVC3のXMLの解析について質問があります。

JavaアプリからXMLにシリアル化されたマップ(HashMap)があります。

これをドットネット側のオブジェクトに解析する必要がありますが、理解できないようです。私の調査では、にシリアル化できないことがわかりましDictionary<string, string>た。

他の誰かが提案しましたpublic struct KeyValuePair<K, V>が、それはうまくいかなかったようです。

また、[XmlArray("mapConfig")]

前提条件の1つはSystem.Xml.Serialization、抽象メッセンジャークラスがあるため、使用する必要があることです。絶対に必要でない場合は、変更を避けたいと思います。

必要に応じて、Javaオブジェクトを変更することでこれが簡単になる可能性がありますが、可能であれば、すでにそこにあるオブジェクトを使用することをお勧めします。それが助けになるなら、JavaレイヤーはXstreamを使用しています。

これがJavaから送信されているXMLのチャンクです

<ConfigurationMap>
    <mapConfig class="hashtable">
      <entry>
        <string>Key1</string>
        <string>Value1</string>
      </entry>
      <entry>
        <string>Key2</string>
        <string>Value2</string>
      </entry>
      <entry>
        <string>Key3</string>
        <string>Value3</string>
      </entry>
      <entry>
        <string>Key4</string>
        <string>Value4</string>
      </entry>
    </mapConfig>
</ConfigurationMap>

ありがとうございます。さらに情報が必要な場合はお知らせください。答えを楽しみにしています。

- アップデート -

当たり前のことだと思いましたが、XMLが文字列の形で言及した抽象的なメッセージで戻ってきていることを述べておかなければなりません。現在の方法は以下を使用します:

XmlDocument doc = new XmlDocument();
doc.LoadXml(this.ResponseXml);
XmlElement main = doc.DocumentElement;

XmlElement cse = util.getElementsFirstChild(main, "MessagePayload");
XmlElement ccs = util.getElementsFirstChild(cse, "ReturnedObjectNameHERE");

System.Xml次に、モデルの属性を使用してフラグメントを逆シリアル化します。

これは、いくつかの一般的なプロパティで使用するモデルの簡単な例です。

[XmlRoot("list")]
public class SearchResults : List<CSearchResult>
{
    public SearchResults() { }
}

[XmlRoot("SearchResult")]
public class SearchResult
{
    [XmlElement("Id")]
    public string OrgUnitId { get; set; }

    [XmlElement("Type")]
    public Type Type { get; set; }

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

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

--UPDATE 2- 以下のこのモデルクラスを使用して、適切なモデルバインディングを取得できました

[XmlRoot("ConfigurationMap")]
public class ConfigurationMap
{
    [XmlElement("mapConfig")]
    public MapConfig mapConfig { get; set; }

}

[XmlRoot("mapConfig")]
public class MapConfig
{
    [XmlArray("entry")]
    public List<string> entry { get; set; }
}

これに関する唯一の問題は、Objectプロパティmapconfigがすべてのエントリを1つのリストにまとめるだけであり、モデルを考えると理にかなっています。

配列タイプをいじって、より良い結果が得られるかどうかを確認しようとしています。MapConfigの配列を作成することを検討していEntryます。Entryリストを保持するかEntry、配列を作成して、オブジェクト構造が次のようになるようにすることができます。

MapConfig: [[key1, value1], [key2, value2], [key3, value3], [key4, value4],]

これがより良い構造であるかどうかを判断しようとしています。

これについてのアドバイスは、私がこれを実行するときに役立ちます。

ありがとう

4

2 に答える 2

2

シリアル化するクラスを作成できます...したがって、xmlでxsd.exeを実行します...

C:\>xsd test.xml
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.17929]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\test.xsd'.

C:\>xsd test.xsd /classes
Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.17929]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:\test.cs'.

次に、単純なc#XmlSerializerを使用します...

NewClassName object = xml.DeSerializeStringToObject<NewClassName>();

以下のヘルパークラス

public static class XmlSerializerHelper
{
    public static T DeSerializeStringToObject<T>(this string sxml)
    {
        using (XmlTextReader xreader = new XmlTextReader(new StringReader(sxml.Replace("&", "&amp;"))))
        {
            XmlSerializer xs = new XmlSerializer(typeof(T));
            return (T)xs.Deserialize(xreader);
        }
    }

    public static string SerializeObjectToString(this object obj)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            XmlSerializer x = new XmlSerializer(obj.GetType());
            x.Serialize(stream, obj);
            return Encoding.Default.GetString(stream.ToArray());
        }
    }
}

もちろん、配列の最初の文字列がキーになります。

于 2013-03-06T18:44:17.810 に答える
0

解決策は私が想像したよりも単純に見えましたが、実際には、正しく解析するためにモデル属性の正しい組み合わせを選択することに依存していました。

これは、各エントリを独自のリストアイテムに分割するために使用することにしたものです。

[XmlRoot("ConfigurationMap")]
public class ConfigurationMap
{
    [XmlArray("mapConfig")]
    [XmlArrayItem("entry")]
    public List<Entry> MapConfig { get; set; }

}

[XmlRoot("entry")]
public class Entry
{
    [XmlElement("string")]
    public List<string> entry { get; set; }
}

うまくいけば、これは他の誰かを助けるでしょう。皆様からのご意見ありがとうございました。

于 2013-03-07T20:05:19.423 に答える