シリアライゼーションを使用して XML を作成していますが、要素に対して属性を動的に作成する必要があるときに問題が発生します。価格データを含む日付の要素を追加しています。XML のクラス構造は次のようになります。
<XmlRoot(ElementName:="root")>
Public Class DateXML
<XmlElement(ElementName:="date")> _
Public Property Dates As List(Of DatePrice)
End Class
Public Class DatePrice
<XmlAttribute("value")> _
Public Property DateValue As String
<XmlElement("price")> _
Public Property Price As String
End Class
XML は、たとえば次のようになります。
<root>
<date value="2013-01-01">
<price>100.00</price>
</date>
<date value="2013-01-02">
<price>100.00</price>
</date>
<date value="2013-01-03">
<price>100.00</price>
</date>
<date value="2013-01-04">
<price>100.00</price>
</date>
<date value="2013-01-08">
<price>100.00</price>
</date>
<date value="2013-01-12">
<price>100.00</price>
</date>
</root>
私の問題は、XML の要件にあります。同じ価格の日付値が複数あるvalue1="2013-01-01" value2="2013-01-02"
場合は、etc を使用してそれらを 1 つのノードに配置する必要があります。さらに、日付が互いに続く場合は、from="" to=""
属性を使用する必要があり、これらの属性を混在させることができます。目標は、属性を使用してできるだけ少ない日付ノードを作成することです。したがって、上記の例は次のようになります。
<root>
<date from="2013-01-01" to="2013-01-04">
<price>100.00</price>
</date>
<date value1="2013-01-08" value2="2013-01-12">
<price>100.00</price>
</date>
</root>
この要件を満たすには、DatePrice クラスをどのように作成すればよいですか? データベースから日付ごとのデータを取得しています。from 属性と to 属性をプロパティとしてクラスに追加できますが、value1、value2 の属性を動的に追加することは可能ですか?
編集:
辞書をシリアライズする方法を発見した後、私は少し近づいています。これが私が試したことです:
<XmlRoot(ElementName:="root")>
Public Class XmlObject
<XmlElement(ElementName:="element")> _
Public Property element As String
Public Property elementAttributes As ValueAttributes
End Class
Public Class ValueAttributes
Public Property values As SerializableDictionary(Of String, String)
End Class
IXmlSerializable を実装するディクショナリ クラス:
Public Class SerializableDictionary(Of AttributeName, AttributeValue)
Inherits Dictionary(Of String, String)
Implements IXmlSerializable
Public Function GetSchema() As System.Xml.Schema.XmlSchema Implements System.Xml.Serialization.IXmlSerializable.GetSchema
Return Nothing
End Function
Public Sub ReadXml(reader As System.Xml.XmlReader) Implements System.Xml.Serialization.IXmlSerializable.ReadXml
If reader.HasAttributes Then
While reader.MoveToNextAttribute()
Dim key As String = reader.Name
Dim value As String = reader.Value
Me.Add(key, value)
End While
reader.MoveToElement()
End If
End Sub
Public Sub WriteXml(writer As System.Xml.XmlWriter) Implements System.Xml.Serialization.IXmlSerializable.WriteXml
For Each kvp As KeyValuePair(Of String, String) In Me
writer.WriteAttributeString(kvp.Key, kvp.Value)
Next
End Sub
End Class
これらを使用して、次のような XML を取得します。
<root>
<element>the element value</element>
<elementAttributes>
<values value1="1" value2="2" value3="3" />
</elementAttributes>
</root>
ここで、属性を に移動し、構造element
を書き込まない方法をどうにかして把握する必要があります。elementAttributes