从自定义对象构造XML的优雅而简单的方法是什么?

时间:2009-12-20 18:56:17

标签: xml vb.net oop

我需要构建一个格式如下的XML事务:

<RateV3Request USERID="MyId">
    <Package ID="1ST">
        <Service>ALL</Service>
        <FirstClassMailType>LETTER</FirstClassMailType>
        <ZipOrigination>06226</ZipOrigination>
        <ZipDestination>06231</ZipDestination>
        <Pounds>0</Pounds>
        <Ounces>4.5</Ounces>
        <Size>REGULAR</Size>
        <Machinable>true</Machinable>
    <ShipDate Option="EMSH">21-Dec-2009</ShipDate> 
    </Package>
</RateV3Request>

我的想法是创建一个包含每个XML属性的类型属性的RateV3Request对象(我假设属性在这里不是正确的单词。)

我正在考虑在我的对象上创建一个“GetXml”函数,它返回对象实例中值的XML表示。我可以自己完成所有字符串连接,但肯定有一种更清晰的方法。

连连呢?我正在使用VB.NET

4 个答案:

答案 0 :(得分:2)

XmlSerializer应该为您完成这项工作。您可以使用XML attributes来控制 如何将属性和字段序列化为XML(例如,作为属性,作为特定元素,根本不是......)。

例如,您的Package类看起来像这样(未经测试):

Public Class Package

    <XmlAttribute("ID")> _
    Public Property ID As String
        ...
    End Property

    Public Service As String

    ...

End Class

然后你可以做这样的事情(未经测试):

Dim packageSerializer As New XmlSerializer(GetType(Package))
Dim writer As New StringWriter()
packageSerializer.Serialize(writer, myPackage)
Console.WriteLine(writer.ToString())

答案 1 :(得分:1)

XML术语:

在XML中,您有元素属性。在您的示例中,ZipOrigination是一个元素 - 它包含一个开始和结束标记。 USERID是一个属性 - 它出现在元素的开始标记中,并且具有名称和值(在引号中)。

.NET Framework类

对于您的特定问题,您可以使用XDocumenthttp://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx)或XmlDocumenthttp://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx)。 XDocument是.NET框架的最新成员,对于许多任务,它是首选。请参阅此主题,例如:http://social.msdn.microsoft.com/forums/en-US/xmlandnetfx/thread/4895ba4d-0425-4d10-9bae-5c33e8385357

自定义类

看起来您希望编写包含属性RateV3RequestUserId的类Package。看起来另一个具有属性ShipDate的类Option可能很有用。然后,最后,您可以编写一个包含所有剩余属性(Id,Service,FirstClassMailType,...,ShipDate)的类Package。每个属性都应具有适当的数据类型。

全部放在一起

您可以为每个自定义类添加GetXml()方法,也可以编写一个专用类(例如RateV3RequestGateway)来处理类和XML之间的所有转换。我倾向于选择专用类,因为它提供了更大的灵活性。如果以后想要使用数据库或JSON而不是XML,则可以编写不同的网关,但不必触及自定义类。

答案 2 :(得分:1)

创建XML值得考虑的两个选项:

  1. 序列化 - 内置并且如果需要,您可以控制序列化程序的工作原理。

  2. 手工工具(这不一定是一个糟糕的选择,因为它可以让你生成完全你想要的东西)然后你想要使用Linq来处理XML - 有一些非常聪明在VB.NET中的东西使这几乎是声明性的(虽然我没有选择我的语言当前是C#)。

  3. 鉴于您的基本要求 - 即生成XML以传递给另一个应用程序,我可能更倾向于使用Hand Crafted,因为使用各种Linq to XML构造创建它是多么容易。

    如果手工制作,那么你可以更灵活地制作模型对象 - 你可以将它们用于你的应用程序,然后使用方法或助手类来生成XML - 更经常我们有一个服务的包装器,它接受我们的模型类并在服务调用附近生成所需的XML。不确定这种模式有多好......但我们发现它有效。

答案 3 :(得分:0)

大多数支持XML的OOP语言都有一个serialization库,可以为你处理这类事情。

一般来说,这个想法是序列化库将反映您的对象并从中构造XML,有时您可能需要为它提供一些提示。在.NET中,提示将采用您用来装饰对象的不同属性的属性的形式。

对于.NET,您可以查看serialization命名空间。