解析Java Map从XML转换为c#对象
本文关键字:转换 XML 对象 Java Map string 解析 | 更新日期: 2023-09-27 18:02:41
大家都有关于c# .net 4 MVC 3中解析XML的问题。
我有一个Map (HashMap),从java应用程序序列化为XML。
我需要将其解析为。net方面的对象,但似乎无法弄清楚。在我的研究中,我发现你不能连载到Dictionary<string, string>
。
有人建议public struct KeyValuePair<K, V>
,但这似乎不起作用。
也尝试了[XmlArray("mapConfig")]
先决条件之一是我们必须使用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; }
}
唯一的问题是对象属性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>();
下面的Helper类
public static class XmlSerializerHelper
{
public static T DeSerializeStringToObject<T>(this string sxml)
{
using (XmlTextReader xreader = new XmlTextReader(new StringReader(sxml.Replace("&", "&"))))
{
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; }
}
希望这能帮助到其他人。