【问题标题】:DataContract XML serialization and XML attributes with VB.NETDataContract XML 序列化和 VB.NET 的 XML 属性
【发布时间】:2011-10-21 18:02:01
【问题描述】:

我是 WCF 的新手,很遗憾只知道 VB.NET。阅读了这篇最有趣的帖子 - DataContract XML serialization and XML attributes 后,我尝试将其直接转换为 VB.NET,但它似乎并没有给我正确的结果。我得到的只是没有属性的根元素:

<root xmlns="http://schemas.datacontract.org/2004/07/shutlBookingService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>;

任何有关如何使用 VB.NET 向元素添加属性的线索将不胜感激。

好的,代码如下:

<ServiceContract()>
    <AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>
    <ServiceBehavior(InstanceContextMode:=InstanceContextMode.PerCall)>
    Public Class Service1

        <WebGet(UriTemplate:="Test", ResponseFormat:=WebMessageFormat.Xml)>
        Public Function Test() As Test

            Dim mc As New Test
            mc.timestamp = Now
            mc.success = "0"
            Return mc

        End Function
End Class

数据合同是:

Imports System
Imports System.Runtime.Serialization
Imports System.Xml
Imports System.Xml.Serialization
Imports System.ServiceModel

<DataContract()> _
<XmlSerializerFormat()> _
Public Class Test

    Private timestamp_att As Date
    Private success_att As String = ""

    <DataMember()>
    <XmlAttribute(AttributeName:="timestamp")> _
    Public Property timestamp() As Date

        Get
            Return Me.timestamp_att
        End Get
        Set(value As Date)
            Me.timestamp_att = value
        End Set
    End Property

    <DataMember()>
    <Xml.Serialization.XmlAttribute(AttributeName:="success")> _
    Public Property success() As String

        Get
            Return Me.success_att
        End Get
        Set(value As String)
            Me.success_att = value
        End Set
    End Property

End Class

输出是:

<Test xmlns="http://schemas.datacontract.org/2004/07/shutlBookingService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <success>0</success>
  <timestamp>2011-10-22T09:28:52.7884244+01:00</timestamp>
</Test>          

您可以看到没有成功和时间戳作为属性。

【问题讨论】:

  • 我在您的 DataContract 类中看不到任何元素 - 也许它需要一个默认元素来挂起属性?我对 XmlSerializer 不是很熟悉,所以我可能是错的。如果您有时间,您可能想要添加一些属性或字段并设置 XmlText 属性,看看是否有帮助。

标签: xml vb.net wcf


【解决方案1】:

您没有发布代码,但您可能使用了错误的语法 - C# 使用方括号([]),VB.NET 使用尖括号(&lt;&gt;):

示例(基于链接答案中的 C# 代码,手动更改为 VB.NET,因此可能存在一些小的语法错字):

<DataContract>
<XmlSerializerFormat>
Public Class root

    Dim distance As New Distance();

End Class

<DataContract>
Public Class distance

    <DataMember>
    <XmlAttribute>
    Pubilc units As String = "m"

    <DataMember>
    <XmlText>
    Public value As Integer = 1000

End Class

您还需要添加对 System.Runtime.Serialiation 和 System.Xml.Serialization 的引用:

Imports System.Runtime.Serialization
Imports System.Xml.Serialzation

更新 为了跟进我在您的问题下的评论中的建议,如果您做了这样的事情会怎样:

<DataContract()> _
<XmlSerializerFormat()> _
Public Class Test

    Private timestamp_att As Date
    Private success_att As String = ""

    'Set up an element
    <DataMember()>
    <XmlElement(ElementName:="Data")> _
    Public DataElement As String = ""

    <DataMember()>
    <XmlAttribute(AttributeName:="timestamp")> _
    Public Property timestamp() As Date

        Get
            Return Me.timestamp_att
        End Get
        Set(value As Date)
            Me.timestamp_att = value
        End Set
    End Property

    <DataMember()>
    <Xml.Serialization.XmlAttribute(AttributeName:="success")> _
    Public Property success() As String

        Get
            Return Me.success_att
        End Get
        Set(value As String)
            Me.success_att = value
        End Set
    End Property

End Class

预期的输出应该是这样的(我还没有测试过):

<Test xmlns="http://schemas.datacontract.org/2004/07/shutlBookingService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Data success="0" timestamp="2011-10-22T09:28:52.7884244+01:00" /></Test>

【讨论】:

  • 抱歉,我不能让它工作。请参阅下面我发布完整代码的位置。
  • 我没有看到任何代码 - 最好更新(编辑)您的问题并将代码发布到那里。
  • 我是这个网站的新用户 - 发现它非常好 - 并且已经改变了它并将代码放在我原来的帖子中。
  • 欢迎来到 SO - 这是一个很棒的社区。我查看了您添加的代码并在上面提出了一个问题。
【解决方案2】:

几周前我正在做同样的事情,这里是我开始工作的代码示例,希望它有所帮助(我已经包含了我用来测试这个的 xml):

        Public Function test()

            Dim output As StringBuilder = New StringBuilder()

            Dim xmlString As String = _
                "<bookstore>" & _
                        "<book genre='autobiography' publicationdate='1981-03-22' ISBN='1-861003-11-0'>" & _
                            "<title>The Autobiography of Benjamin Franklin</title>" & _
                            "<author>" & _
                                "<first-name>Benjamin</first-name>" & _
                                "<last-name>Franklin</last-name>" & _
                            "</author> " & _
                            "<price>8.99</price>" & _
                        "</book>" & _
                    "</bookstore>"



            Dim s As XNamespace = "TestNamespace"
            Dim e As XElement = XElement.Parse(xmlString)
            Dim price = e.Element("inventory").Element("price").Value


            'OutputTextBlock.Text = output.ToString()
        End Function

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2015-04-17
    • 1970-01-01
    • 2011-11-21
    相关资源
    最近更新 更多