【问题标题】:Deserialize XML Messages to Objects将 XML 消息反序列化为对象
【发布时间】:2011-09-29 20:39:49
【问题描述】:

我正在为使用 HTTP 传输 XML 消息的协议编写客户端。它是同步的,因为我形成了一个遵循 DTD 的 XML 文档,并通过带有 WebClient 类的 POST 将其发送到协议网关,并且我从远程服务器获得 XML 响应消息以指示事务状态/消息 ID/等。

既然我有 DTD,是否可以用它创建类?对于我的 XML 消息正在执行的每种“操作”类型,都有一些可能的响应,并且具有可以被返回的服务器 XML 水合的类将是有利的。

一旦我有了这些类,将 XML 消息从服务器反序列化为对象的基本步骤是什么?

【问题讨论】:

    标签: c# .net xml-serialization


    【解决方案1】:

    一旦你有了 xml 字符串,你就可以做这样的事情,其中​​ T 是你的通用对象。

    public static T GetObjectFromXmlString<T>(string xml)
    {
        T result = default(T);
    
        if (string.IsNullOrEmpty(xml))
            return result;
    
        using (StringReader sr = new StringReader(xml))
        {
            using (XmlTextReader xr = new XmlTextReader(sr))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                result = (T)serializer.Deserialize(xr);
            }                   
        }
    
        return result;
    }
    

    【讨论】:

    • 很好,我得试试。你会碰巧对我的问题的另一部分有解决方案吗?我想要一个简单的过程来从 DTD 生成类。我会尝试 Eric H 的建议,但我希望 .Net 或 VS2010 有一个工具可以帮助解决这个问题。
    • 我没有更好的方法从 DTD 生成类。我不确定您的要求,但如果您必须生成一次(dtd 是静态的),我会使用一些工具。但是如果您必须动态生成类,您可以读取 dtd 文件并使用反射来创建类或程序集。只是一个想法。
    • 是的,我使用了一个工具,因为它是静态的,因为它是一个协议。
    • 顺便说一句,使用块不会关闭/处理 StringReader 和 XmlTextReader 吗?我不认为显式 close() 调用是必要的。
    • 你是对的。我不认为你需要它。我会编辑答案。另外,这只是一个示例,请确保处理异常等。
    【解决方案2】:

    将 DTD 转换为 XSD(不确定是否仍需要此步骤):

    Free DTD to XSD conversion utility?

    从XSD生成C#类(命令行工具,我就是这样做的,不知道有没有更好的方法):

    http://quickstart.developerfusion.co.uk/quickstart/howto/doc/xmlserialization/XSDToCls.aspx

    从 XML 序列化回类:

    http://support.microsoft.com/kb/815813

    【讨论】:

    • 这绝对让我开始着手我打算做的事情。我使用 trang 将 DTD 转换为 XSD,并从新的 XSD 文件生成类。从这里完成序列化和反序列化的代码应该很容易。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    相关资源
    最近更新 更多