解析Java映射<;字符串,字符串>;从XML到C#对象

解析Java映射<;字符串,字符串>;从XML到C#对象,c#,java,.net,xml,xml-serialization,C#,Java,.net,Xml,Xml Serialization,大家都有一个关于C#.net 4 MVC 3中解析XML的问题 我有一个从java应用程序序列化为XML的映射(HashMap) 我需要在dotnet端将其解析为一个对象,但似乎无法理解它。在我的研究中,我发现你无法序列化到字典中 其他人建议使用public-struct-KeyValuePair,但这似乎不起作用 还尝试了[XmlArray(“mapConfig”)] 先决条件之一是我们必须使用System.Xml.Serialization,因为我们有一个抽象的messenger类,如果不一

大家都有一个关于C#.net 4 MVC 3中解析XML的问题

我有一个从java应用程序序列化为XML的映射(HashMap)

我需要在dotnet端将其解析为一个对象,但似乎无法理解它。在我的研究中,我发现你无法序列化到
字典中

其他人建议使用
public-struct-KeyValuePair
,但这似乎不起作用

还尝试了
[XmlArray(“mapConfig”)]

先决条件之一是我们必须使用
System.Xml.Serialization
,因为我们有一个抽象的messenger类,如果不一定要更改的话,我希望避免更改它

如果必须的话,我可能会更改Java对象,如果这样做会更容易,但如果可能的话,我宁愿使用已经存在的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>
然后,我们使用模型上的
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; }
}
试图确定这是否是一个更好的结构

任何关于这方面的建议都会对我的工作有所帮助


谢谢

您可以创建一个类来序列化到。。。 所以在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>();
NewClassName object=xml.DeSerializeStringToObject();
下面的助手类

[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; }
}
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());
        }
    }
}
公共静态类XmlSerializerHelper
{
公共静态T反序列化StringToObject(此字符串为sxml)
{
使用(XmlTextReader xreader=新的XmlTextReader(新的StringReader(sxml.Replace(“&“,“&;”)))
{
XmlSerializer xs=新的XmlSerializer(typeof(T));
返回(T)xs.反序列化(xreader);
}
}
公共静态字符串序列化ObjectToString(此对象obj)
{
使用(MemoryStream stream=new MemoryStream())
{
XmlSerializer x=新的XmlSerializer(obj.GetType());
x、 序列化(流,obj);
返回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; }
}
[XmlRoot(“配置映射”)]
公共类配置图
{
[XmlArray(“mapConfig”)]
[XmlArrayItem(“条目”)]
公共列表MapConfig{get;set;}
}
[XmlRoot(“条目”)]
公开课入学
{
[XmlElement(“字符串”)]
公共列表项{get;set;}
}

希望这能帮助其他人。感谢大家的输入。

这个简单的结构可以使用XmlReader轻松手动解析。;这看起来像是家庭作业,所以我调整了标记,因为OP说,
“我们必须使用”
删除了标记java,因为问题中没有任何与java编程相关的内容。@Chuck Savage该标记已弃用,不应再使用。考虑他们的优点,而不是他们的动机。而且,你的要求可能会使事情变得更困难。Java的XML序列化和.NET的XML序列化并不是为了进行互操作或方便地处理与任意XML之间的数据结构映射,如果试图强迫他们使用,而不是使用正确的工具来完成工作,似乎会适得其反。+1实际上提供了一个建设性的答案。非常感谢。我正在研究这个问题,并尝试不同的方法来反序列化它。不幸的是,从我所读的内容来看,似乎没有一个好的内置属性和模型结构来解释这一点。除了创建自定义字典序列化对象之外,昨天我还和xsd混了一会儿,它一直在创建不可对给定xml进行序列化的类。仔细研究了一下,发现xsd在试图从XML创建数组和数组时存在一个bug。你可以在这里看到。这给了我一些不同类型的模型绑定的尝试线索。以下是该错误的链接:
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; }
}