繁体   English   中英

解析Java地图 <string, string> 从XML到C#Object

[英]Parse Java Map<string, string> from XML into C# Object

嘿,每个人都有一个关于在C#.net 4 MVC 3中解析一些XML的问题。

我有一个从Java应用程序序列化为XML的Map(HashMap)。

我需要将它解析为dotnet端的一个对象,但似乎无法弄明白。 在我的研究中,我看到你无法序列化为Dictionary<string, string>

其他人建议使用public struct KeyValuePair<K, V>但这似乎不起作用。

还尝试了[XmlArray("mapConfig")]

其中一个先决条件是我们必须使用System.Xml.Serialization因为我们有一个抽象的messenger类,如果我不是必须的话,我想避免改变它。

如果必须的话,我可能会更改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>

谢谢,如果您需要更多信息,请告诉我。 期待答案。

--UPDATE--

我认为这很明显,但我应该提到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; }
}

- 更新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只是将所有条目聚集在一个列表中,这对于模型是有意义的。

试图搞乱数组类型,看看我是否能获得更好的结果。 看看MapConfig是一个Entry数组。 我可以保持Entry列表或使Entry成为一个数组,以便对象结构变为:

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

试着决定这是否是一个更好的结构。

当我解决这个问题时,对此的任何建议都会有所帮助。

谢谢

你可以创建一个序列化的类...所以在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());
        }
    }
}

当然,数组中的第一个字符串将是键。

解决方案似乎比我想象的更简单,但实际上取决于选择正确的模型属性组合来正确解析。

这是我决定使用的那个,因为它将每个条目分成它自己的列表项。

[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; }
}

希望这有助于其他人。 感谢大家的意见和建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM