【问题标题】:XML - generating secondary element with same name issueXML - 生成具有相同名称的辅助元素问题
【发布时间】:2019-07-17 07:51:06
【问题描述】:

我无法在配置元素下的同一级别中创建多个同名的 VB.NET XML 元素。我只能用“Description1”的name 创建一个attribute。我到底不明白什么?

  <configuration name="Default" quantity="1">
    <attribute name="Description1" value="1" />
    <attribute name="Description2" value="1" />
  </configuration>

我试图将属性元素更改为数组,但我想我不知道我在做什么。

Public Class transaction
    <Xml.Serialization.XmlElement>
    Public Property document() As document

    <Xml.Serialization.XmlAttribute>
    Public Property type() As String
    <Xml.Serialization.XmlAttribute>
    Public Property [date]() As Integer
    <Xml.Serialization.XmlAttribute>
    Public Property name() As String

End Class

Public Class document
    <Xml.Serialization.XmlAttribute>
    Public Property aliasset As String
    <Xml.Serialization.XmlAttribute>
    Public Property eid As String

    <Xml.Serialization.XmlElement>
    Public Property configuration As Configuration
End Class

Public Class configuration
    <Xml.Serialization.XmlAttribute>
    Public Property name As String
    <Xml.Serialization.XmlAttribute>
    Public Property quantity As Integer
    <Xml.Serialization.XmlElement>
    Public Property attribute As attribute
End Class

Public Class attribute
    <Xml.Serialization.XmlAttribute>
    Public Property name As String
    <Xml.Serialization.XmlAttribute>
    Public Property value As String
End Class

我正在尝试将此与此一起使用:

Private Sub Create_button_Click(sender As Object, e As EventArgs) Handles Create_button.Click

    Dim cf As New Transactions()
    cf.transaction = New transaction() With {.type = "wf_export_document_attributes", .date = 1235456, .name = "QUALITY"}
    cf.transaction.document = New document() With {.aliasset = "", .eid = "1234567"}
    cf.transaction.document.configuration = New configuration() With {.name = "Default", .quantity = "1"}
    cf.transaction.document.configuration.attribute = New attribute() With {.name = "Description", .value = "1"}
    cf.transaction.document.configuration.attribute = New attribute() With {.name = "Description2", .value = "1"}

    Dim s As New System.Xml.Serialization.XmlSerializer(GetType(Transactions))

    Using fs As New System.IO.FileStream("C:\temp\file.xml", System.IO.FileMode.OpenOrCreate)
        s.Serialize(fs, cf)
    End Using
End Sub

【问题讨论】:

  • 你应该使用Option Strict On - 我可以看到类型不匹配的一个地方:.quantity = "1".quantity 被声明为整数。

标签: xml vb.net


【解决方案1】:

你需要有某种类型的变量可以容纳多个attributes,比如List(Of Attribute),像这样:

Public Class configuration
    <Xml.Serialization.XmlAttribute>
    Public Property name As String

    <Xml.Serialization.XmlAttribute>
    Public Property quantity As Integer

    <Xml.Serialization.XmlElement(ElementName:="attribute")>
    Public Property attributes As List(Of attribute)

End Class

然后添加它们:

Dim cf As New Transactions()
cf.transaction = New transaction() With {.type = "wf_export_document_attributes", .date = 1235456, .name = "QUALITY"}
cf.transaction.document = New document() With {.aliasset = "", .eid = "1234567"}
cf.transaction.document.configuration = New configuration() With {.name = "Default", .quantity = 1}
cf.transaction.document.configuration.attributes = New List(Of attribute) From {New attribute With {.name = "Description1", .value = "1"}}
cf.transaction.document.configuration.attributes.Add(New attribute() With {.name = "Description1", .value = "1"})

Dim s As New System.Xml.Serialization.XmlSerializer(GetType(Transactions))

Using fs As New System.IO.FileStream("C:\temp\file.xml", System.IO.FileMode.Create)
    s.Serialize(fs, cf)
End Using

这导致了:

<?xml version="1.0"?>
<Transactions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <transaction type="wf_export_document_attributes" date="1235456" name="QUALITY">
    <document aliasset="" eid="1234567">
      <configuration name="Default" quantity="1">
        <attribute name="Description1" value="1" />
        <attribute name="Description1" value="1" />
      </configuration>
    </document>
  </transaction>
</Transactions>

N.B.当我指定ElementName:="attribute" 时,它在末尾添加了一个额外的“s>”。我不知道为什么。如果该属性对您造成同样的错误,您可以直接将其命名为“属性”而不是“属性”。 愚蠢的我,我没有发现 FileMode.OpenOrCreate 搞砸了。

【讨论】:

  • 好吧,这确实帮了我很多忙,让它工作了!我也搞砸了 FileMode.OpenorCreate 一段时间。必须先删除 XML,然后再尝试重新编写或更改它以创建它而不是打开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多