Spezielle XML (BMECAT 1.2) als Klasse darstellen

  • C#

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Spezielle XML (BMECAT 1.2) als Klasse darstellen

    Hallöchen,

    ich komme mal gleich zur Sache.

    Gegeben ist eine XML die nach dem BMECAT Standard läuft. Dazu gibt es eine DTD zur Validierung und die XSD.
    Jetzt ist die Frage wie kann ich diese XML in eine Klasse einlesen auch wenn manche Felder nicht existieren weil es nur KANN Felder sind und keine muss.

    Desweiteren gibt es im Header der Datei dann noch USER_DEFINED Sachen die jeder selbst hinzufügen kann.

    Die Spezifikation dazu ist folgende: bme.de/fileadmin/content/Inita…_BMEcat_1.2/BMEcatV12.pdf
    Im Anhang findet ihr eine Musterdatei.

    Habt ihr ne Ahnung wie ich das bewerkstelligen kann?
    Dateien
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Ja.
    Notfalls hat Visual Studio
    Edit ... PasteSpecial ... Paste XML As Classes.

    Es gibt aber auch Online-Konverter.
    Da kommt dann so was raus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Imports System.Xml.Serialization
    2. Imports System.Collections.Generic
    3. Namespace BMECAT
    4. <XmlRoot(ElementName:="DATETIME")>
    5. Public Class DATETIME
    6. <XmlElement(ElementName:="DATE")>
    7. Public Property [DATE] As String
    8. <XmlElement(ElementName:="TIME")>
    9. Public Property TIME As String
    10. <XmlAttribute(AttributeName:="type")>
    11. Public Property Type As String
    12. End Class
    13. <XmlRoot(ElementName:="CATALOG")>
    14. Public Class CATALOG
    15. <XmlElement(ElementName:="LANGUAGE")>
    16. Public Property LANGUAGE As String
    17. <XmlElement(ElementName:="CATALOG_ID")>
    18. Public Property CATALOG_ID As String
    19. <XmlElement(ElementName:="CATALOG_VERSION")>
    20. Public Property CATALOG_VERSION As String
    21. <XmlElement(ElementName:="CATALOG_NAME")>
    22. Public Property CATALOG_NAME As String
    23. <XmlElement(ElementName:="DATETIME")>
    24. Public Property DATETIME As DATETIME
    25. <XmlElement(ElementName:="CURRENCY")>
    26. Public Property CURRENCY As String
    27. End Class
    28. <XmlRoot(ElementName:="BUYER")>
    29. Public Class BUYER
    30. <XmlElement(ElementName:="BUYER_NAME")>
    31. Public Property BUYER_NAME As String
    32. End Class
    33. <XmlRoot(ElementName:="SUPPLIER")>
    34. Public Class SUPPLIER
    35. <XmlElement(ElementName:="SUPPLIER_NAME")>
    36. Public Property SUPPLIER_NAME As String
    37. End Class
    38. <XmlRoot(ElementName:="HEADER")>
    39. Public Class HEADER
    40. <XmlElement(ElementName:="GENERATOR_INFO")>
    41. Public Property GENERATOR_INFO As String
    42. <XmlElement(ElementName:="CATALOG")>
    43. Public Property CATALOG As CATALOG
    44. <XmlElement(ElementName:="BUYER")>
    45. Public Property BUYER As BUYER
    46. <XmlElement(ElementName:="SUPPLIER")>
    47. Public Property SUPPLIER As SUPPLIER
    48. End Class
    49. <XmlRoot(ElementName:="CATALOG_STRUCTURE")>
    50. Public Class CATALOG_STRUCTURE
    51. <XmlElement(ElementName:="GROUP_ID")>
    52. Public Property GROUP_ID As String
    53. <XmlElement(ElementName:="GROUP_NAME")>
    54. Public Property GROUP_NAME As String
    55. <XmlElement(ElementName:="PARENT_ID")>
    56. Public Property PARENT_ID As String
    57. <XmlElement(ElementName:="GROUP_ORDER")>
    58. Public Property GROUP_ORDER As String
    59. <XmlAttribute(AttributeName:="type")>
    60. Public Property Type As String
    61. <XmlElement(ElementName:="MIME_INFO")>
    62. Public Property MIME_INFO As MIME_INFO
    63. End Class
    64. <XmlRoot(ElementName:="MIME")>
    65. Public Class MIME
    66. <XmlElement(ElementName:="MIME_TYPE")>
    67. Public Property MIME_TYPE As String
    68. <XmlElement(ElementName:="MIME_SOURCE")>
    69. Public Property MIME_SOURCE As String
    70. <XmlElement(ElementName:="MIME_DESCR")>
    71. Public Property MIME_DESCR As String
    72. <XmlElement(ElementName:="MIME_PURPOSE")>
    73. Public Property MIME_PURPOSE As String
    74. <XmlElement(ElementName:="MIME_ORDER")>
    75. Public Property MIME_ORDER As String
    76. End Class
    77. <XmlRoot(ElementName:="MIME_INFO")>
    78. Public Class MIME_INFO
    79. <XmlElement(ElementName:="MIME")>
    80. Public Property MIME As List(Of MIME)
    81. End Class
    82. <XmlRoot(ElementName:="CATALOG_GROUP_SYSTEM")>
    83. Public Class CATALOG_GROUP_SYSTEM
    84. <XmlElement(ElementName:="GROUP_SYSTEM_ID")>
    85. Public Property GROUP_SYSTEM_ID As String
    86. <XmlElement(ElementName:="GROUP_SYSTEM_NAME")>
    87. Public Property GROUP_SYSTEM_NAME As String
    88. <XmlElement(ElementName:="CATALOG_STRUCTURE")>
    89. Public Property CATALOG_STRUCTURE As List(Of CATALOG_STRUCTURE)
    90. End Class
    91. <XmlRoot(ElementName:="ARTICLE_DETAILS")>
    92. Public Class ARTICLE_DETAILS
    93. <XmlElement(ElementName:="DESCRIPTION_SHORT")>
    94. Public Property DESCRIPTION_SHORT As String
    95. <XmlElement(ElementName:="DESCRIPTION_LONG")>
    96. Public Property DESCRIPTION_LONG As String
    97. <XmlElement(ElementName:="EAN")>
    98. Public Property EAN As String
    99. <XmlElement(ElementName:="MANUFACTURER_AID")>
    100. Public Property MANUFACTURER_AID As String
    101. <XmlElement(ElementName:="MANUFACTURER_NAME")>
    102. Public Property MANUFACTURER_NAME As String
    103. <XmlElement(ElementName:="DELIVERY_TIME")>
    104. Public Property DELIVERY_TIME As String
    105. <XmlElement(ElementName:="KEYWORD")>
    106. Public Property KEYWORD As List(Of String)
    107. <XmlElement(ElementName:="ARTICLE_ORDER")>
    108. Public Property ARTICLE_ORDER As String
    109. <XmlElement(ElementName:="SPECIAL_TREATMENT_CLASS")>
    110. Public Property SPECIAL_TREATMENT_CLASS As List(Of SPECIAL_TREATMENT_CLASS)
    111. End Class
    112. <XmlRoot(ElementName:="ARTICLE_FEATURES")>
    113. Public Class ARTICLE_FEATURES
    114. <XmlElement(ElementName:="REFERENCE_FEATURE_SYSTEM_NAME")>
    115. Public Property REFERENCE_FEATURE_SYSTEM_NAME As String
    116. <XmlElement(ElementName:="REFERENCE_FEATURE_GROUP_ID")>
    117. Public Property REFERENCE_FEATURE_GROUP_ID As String
    118. <XmlElement(ElementName:="FEATURE")>
    119. Public Property FEATURE As List(Of FEATURE)
    120. End Class
    121. <XmlRoot(ElementName:="FEATURE")>
    122. Public Class FEATURE
    123. <XmlElement(ElementName:="FNAME")>
    124. Public Property FNAME As String
    125. <XmlElement(ElementName:="FVALUE")>
    126. Public Property FVALUE As List(Of String)
    127. <XmlElement(ElementName:="FORDER")>
    128. Public Property FORDER As String
    129. <XmlElement(ElementName:="FUNIT")>
    130. Public Property FUNIT As String
    131. End Class
    132. <XmlRoot(ElementName:="ARTICLE_ORDER_DETAILS")>
    133. Public Class ARTICLE_ORDER_DETAILS
    134. <XmlElement(ElementName:="ORDER_UNIT")>
    135. Public Property ORDER_UNIT As String
    136. <XmlElement(ElementName:="CONTENT_UNIT")>
    137. Public Property CONTENT_UNIT As String
    138. <XmlElement(ElementName:="NO_CU_PER_OU")>
    139. Public Property NO_CU_PER_OU As String
    140. <XmlElement(ElementName:="QUANTITY_MIN")>
    141. Public Property QUANTITY_MIN As String
    142. <XmlElement(ElementName:="QUANTITY_INTERVAL")>
    143. Public Property QUANTITY_INTERVAL As String
    144. End Class
    145. <XmlRoot(ElementName:="ARTICLE_PRICE")>
    146. Public Class ARTICLE_PRICE
    147. <XmlElement(ElementName:="PRICE_AMOUNT")>
    148. Public Property PRICE_AMOUNT As String
    149. <XmlElement(ElementName:="PRICE_CURRENCY")>
    150. Public Property PRICE_CURRENCY As String
    151. <XmlElement(ElementName:="TAX")>
    152. Public Property TAX As String
    153. <XmlElement(ElementName:="LOWER_BOUND")>
    154. Public Property LOWER_BOUND As String
    155. <XmlAttribute(AttributeName:="price_type")>
    156. Public Property Price_type As String
    157. End Class
    158. <XmlRoot(ElementName:="ARTICLE_PRICE_DETAILS")>
    159. Public Class ARTICLE_PRICE_DETAILS
    160. <XmlElement(ElementName:="ARTICLE_PRICE")>
    161. Public Property ARTICLE_PRICE As List(Of ARTICLE_PRICE)
    162. End Class
    163. <XmlRoot(ElementName:="ARTICLE_REFERENCE")>
    164. Public Class ARTICLE_REFERENCE
    165. <XmlElement(ElementName:="ART_ID_TO")>
    166. Public Property ART_ID_TO As String
    167. <XmlAttribute(AttributeName:="type")>
    168. Public Property Type As String
    169. End Class
    170. <XmlRoot(ElementName:="ARTICLE")>
    171. Public Class ARTICLE
    172. <XmlElement(ElementName:="SUPPLIER_AID")>
    173. Public Property SUPPLIER_AID As String
    174. <XmlElement(ElementName:="ARTICLE_DETAILS")>
    175. Public Property ARTICLE_DETAILS As ARTICLE_DETAILS
    176. <XmlElement(ElementName:="ARTICLE_FEATURES")>
    177. Public Property ARTICLE_FEATURES As List(Of ARTICLE_FEATURES)
    178. <XmlElement(ElementName:="ARTICLE_ORDER_DETAILS")>
    179. Public Property ARTICLE_ORDER_DETAILS As ARTICLE_ORDER_DETAILS
    180. <XmlElement(ElementName:="ARTICLE_PRICE_DETAILS")>
    181. Public Property ARTICLE_PRICE_DETAILS As ARTICLE_PRICE_DETAILS
    182. <XmlElement(ElementName:="MIME_INFO")>
    183. Public Property MIME_INFO As MIME_INFO
    184. <XmlElement(ElementName:="ARTICLE_REFERENCE")>
    185. Public Property ARTICLE_REFERENCE As List(Of ARTICLE_REFERENCE)
    186. <XmlAttribute(AttributeName:="mode")>
    187. Public Property Mode As String
    188. End Class
    189. <XmlRoot(ElementName:="SPECIAL_TREATMENT_CLASS")>
    190. Public Class SPECIAL_TREATMENT_CLASS
    191. <XmlAttribute(AttributeName:="type")>
    192. Public Property Type As String
    193. <XmlText>
    194. Public Property Text As String
    195. End Class
    196. <XmlRoot(ElementName:="ARTICLE_TO_CATALOGGROUP_MAP")>
    197. Public Class ARTICLE_TO_CATALOGGROUP_MAP
    198. <XmlElement(ElementName:="ART_ID")>
    199. Public Property ART_ID As String
    200. <XmlElement(ElementName:="CATALOG_GROUP_ID")>
    201. Public Property CATALOG_GROUP_ID As String
    202. End Class
    203. <XmlRoot(ElementName:="T_NEW_CATALOG")>
    204. Public Class T_NEW_CATALOG
    205. <XmlElement(ElementName:="CATALOG_GROUP_SYSTEM")>
    206. Public Property CATALOG_GROUP_SYSTEM As CATALOG_GROUP_SYSTEM
    207. <XmlElement(ElementName:="ARTICLE")>
    208. Public Property ARTICLE As List(Of ARTICLE)
    209. <XmlElement(ElementName:="ARTICLE_TO_CATALOGGROUP_MAP")>
    210. Public Property ARTICLE_TO_CATALOGGROUP_MAP As List(Of ARTICLE_TO_CATALOGGROUP_MAP)
    211. End Class
    212. <XmlRoot(ElementName:="BMECAT")>
    213. Public Class BMECAT
    214. <XmlElement(ElementName:="HEADER")>
    215. Public Property HEADER As HEADER
    216. <XmlElement(ElementName:="T_NEW_CATALOG")>
    217. Public Property T_NEW_CATALOG As T_NEW_CATALOG
    218. <XmlAttribute(AttributeName:="version")>
    219. Public Property Version As String
    220. End Class
    221. End Namespace

    Du kannst dir das jetzt noch gegen die Spezifikation vergleichen, ob vielleicht der eine oder andere Datentyp korrigiert werden sollte.
    Und die unschön benannten Objekte vielleicht noch in Pascal Case Format umbenennen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    ErfinderDesRades schrieb:

    zb mittm (windows-on-bord) kommandozeilentool xsd.exe kann man aus einer xsd vb oder c#-Code generieren.
    vlt hat VisualStudio da auch iwie Knöppe für - weiss ich aber nicht.

    Werd ich mir nachher mal anschauen danke.

    @petaod ja genau das habe ich auch schon versucht und gemacht. Du hast die XML genommen und dann in nen Converter gehauen.
    Problem ist nun diese Spezifikation kann auch "kann" Felder enthalten die nicht in jeder XML vorkommen.

    Daher ja auch das Problem. Ich denke aber mal das der Weg mit der XSD funktionieren kann da dort ja alle Felder beschrieben sind die dann zu einer Klasse werden.

    Melde mich nochmal sobald ich da getestet habe.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Wenn du eine XSD hast, ist das immer die bevorzugte Variante.

    Eine XML zu nehmen ist nur Reverse Engineering, das am besten funktioniert, wenn du eine möglichst komplette XML-Datei hast.
    Das ergibt ein gut brauchbares Grundgerüst.
    Den Rest musst du mit Hilfe der Spezifikation anpassen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @xChRoNiKx Wir legen Makro-Informationen als XML-Datei ab, ich erkenne da eine ähnliche Struktur.
    Es gibt einen Sack Befehle, jeder Befehl hat beliebige Properties, die dann in die XML geschrieben werden.
    Gelesen und geschrieben werden können da natürlich nur implementierte Befehle.
    Du kanst dann eine Property einfügen, ob ein Kann-Feld geschrieben werden soll oder nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!