我需要构建一个格式如下的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
答案 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类
对于您的特定问题,您可以使用XDocument
(http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx)或XmlDocument
(http://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。
自定义类
看起来您希望编写包含属性RateV3Request
和UserId
的类Package
。看起来另一个具有属性ShipDate
的类Option
可能很有用。然后,最后,您可以编写一个包含所有剩余属性(Id,Service,FirstClassMailType,...,ShipDate)的类Package
。每个属性都应具有适当的数据类型。
全部放在一起
您可以为每个自定义类添加GetXml()
方法,也可以编写一个专用类(例如RateV3RequestGateway
)来处理类和XML之间的所有转换。我倾向于选择专用类,因为它提供了更大的灵活性。如果以后想要使用数据库或JSON而不是XML,则可以编写不同的网关,但不必触及自定义类。
答案 2 :(得分:1)
创建XML值得考虑的两个选项:
序列化 - 内置并且如果需要,您可以控制序列化程序的工作原理。
手工工具(这不一定是一个糟糕的选择,因为它可以让你生成完全你想要的东西)然后你想要使用Linq来处理XML - 有一些非常聪明在VB.NET中的东西使这几乎是声明性的(虽然我没有选择我的语言当前是C#)。
鉴于您的基本要求 - 即生成XML以传递给另一个应用程序,我可能更倾向于使用Hand Crafted,因为使用各种Linq to XML构造创建它是多么容易。
如果手工制作,那么你可以更灵活地制作模型对象 - 你可以将它们用于你的应用程序,然后使用方法或助手类来生成XML - 更经常我们有一个服务的包装器,它接受我们的模型类并在服务调用附近生成所需的XML。不确定这种模式有多好......但我们发现它有效。
答案 3 :(得分:0)
大多数支持XML的OOP语言都有一个serialization库,可以为你处理这类事情。
一般来说,这个想法是序列化库将反映您的对象并从中构造XML,有时您可能需要为它提供一些提示。在.NET中,提示将采用您用来装饰对象的不同属性的属性的形式。
对于.NET,您可以查看serialization命名空间。