Probleme beim Lesen von XML-Dateien mit verschachteltem Namespace

  • VB.NET
  • .NET 5–6

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Probleme beim Lesen von XML-Dateien mit verschachteltem Namespace

    Hallo zusammen,

    Ich habe XLS-Dateien die wie folgt beginnen:

    XML-Quellcode

    1. <AutoindexBundle xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://dev.mysite.com/settings/settingsExchange">
    2. <Autoindex xmlns:d2p1="http://dev.mysite.com/settings/workflows/autoindex">
    3. <Header xmlns="http://dev.mysite.com/settings/bpsprocesses/common">
    4. <Guid xmlns="http://dev.mysite.com/settings/interop">0a3b7b31-907a-40bf-b55f-747046dc7ea2</Guid>
    5. <ID xmlns="http://dev.mysite.com/settings/interop">413</ID>
    6. <Name xmlns="http://dev.mysite.com/settings/interop">SD_CLEAR_STATUS</Name>
    7. <Description>Löscht die Einträge im Statusfeld</Description>
    8. </Header>
    9. <d2p1:AIMatchOptionSettings>
    10. <d2p1:MatchCodes>
    11. ...



    Ich möchte nun z.B. den Wert unter <Header><Name> ermitteln. Da ich hier aber bei allen Versuchen ein NOTHING erhalte habe ich folgenden Code probiert:

    VB.NET-Quellcode

    1. Imports System.Xml
    2. Imports System.Xml.Serialization
    3. Imports System.Xml.XPath
    4. Imports Microsoft.Win32
    5. Imports <xmlns="http://dev.mysite.com/settings/settingsExchange">
    6. Imports <xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    7. Imports <xmlns:d2p1="http://dev.mysite.com/bpw">
    8. .
    9. .
    10. .
    11. Dim doc As XDocument = XDocument.Load(strFiles)
    12. Dim autoindex As XElement = doc.Root.<Autoindex>.FirstOrDefault
    13. Dim header1 As XElement = doc.Root.<Autoindex>.<Header>.FirstOrDefault
    14. Dim header2 As XElement = autoindex.<Header>.FirstOrDefault



    Die Variable doc wird erfolgreich geladen und enthält den kompletten Inhalt der XML-Datei. Die Variable autoindex wird ebenfalls korrekt erstellt und enthält das komplette Element <autoindex>. Die beiden Variablen header1 und header2 bleiben aber NOTHING.
    Was mache ich hier falsch, wie kann man den Wert von <Header><Name> korrekt abfragen bzw. wie kann ich das Element <header> laden?

    VG Hofi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Hofi1609“ ()

    Hmm, klappt das so vielleicht?:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Xml
    2. Module Module1
    3. Sub Main()
    4. ' Definieren des XML als String
    5. Dim xmlContent As String = "<AutoindexBundle xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://dev.mysite.com/settings/settingsExchange"">" &
    6. "<Autoindex xmlns:d2p1=""http://dev.mysite.com/settings/workflows/autoindex"">" &
    7. "<Header xmlns=""http://dev.mysite.com/settings/bpsprocesses/common"">" &
    8. "<Guid xmlns=""http://dev.mysite.com/settings/interop"">0a3b7b31-907a-40bf-b55f-747046dc7ea2</Guid>" &
    9. "<ID xmlns=""http://dev.mysite.com/settings/interop"">413</ID>" &
    10. "<Name xmlns=""http://dev.mysite.com/settings/interop"">SD_CLEAR_STATUS</Name>" &
    11. "<Description xmlns=""http://dev.mysite.com/settings/interop"">Löscht die Einträge im Statusfeld</Description>" &
    12. "</Header>" &
    13. "</Autoindex>" &
    14. "</AutoindexBundle>"
    15. ' Initialisieren eines neuen XmlDocuments und laden des Inhalts
    16. Dim xmlDoc As New XmlDocument()
    17. xmlDoc.LoadXml(xmlContent)
    18. ' Erstellen eines XmlNamespaceManagers und hinzufügen der Namensräume
    19. Dim nsmgr As New XmlNamespaceManager(xmlDoc.NameTable)
    20. nsmgr.AddNamespace("exch", "http://dev.mysite.com/settings/settingsExchange")
    21. nsmgr.AddNamespace("comm", "http://dev.mysite.com/settings/bpsprocesses/common")
    22. nsmgr.AddNamespace("interop", "http://dev.mysite.com/settings/interop")
    23. ' XPath-Abfragen, um die gewünschten Knoten zu finden
    24. Dim guidNode As XmlNode = xmlDoc.SelectSingleNode("//comm:Header/interop:Guid", nsmgr)
    25. Dim idNode As XmlNode = xmlDoc.SelectSingleNode("//comm:Header/interop:ID", nsmgr)
    26. Dim nameNode As XmlNode = xmlDoc.SelectSingleNode("//comm:Header/interop:Name", nsmgr)
    27. Dim descriptionNode As XmlNode = xmlDoc.SelectSingleNode("//comm:Header/interop:Description", nsmgr)
    28. ' Überprüfen, ob die Knoten gefunden wurden, bevor auf ihre Werte zugegriffen werden
    29. If guidNode IsNot Nothing Then
    30. Console.WriteLine("Guid: " & guidNode.InnerText)
    31. Else
    32. Console.WriteLine("Guid node not found")
    33. End If
    34. If idNode IsNot Nothing Then
    35. Console.WriteLine("ID: " & idNode.InnerText)
    36. Else
    37. Console.WriteLine("ID node not found")
    38. End If
    39. If nameNode IsNot Nothing Then
    40. Console.WriteLine("Name: " & nameNode.InnerText)
    41. Else
    42. Console.WriteLine("Name node not found")
    43. End If
    44. If descriptionNode IsNot Nothing Then
    45. Console.WriteLine("Description: " & descriptionNode.InnerText)
    46. Else
    47. Console.WriteLine("Description node not found")
    48. End If
    49. Console.ReadKey()
    50. End Sub
    51. End Module




    Oder so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim xmlContent As String = "<AutoindexBundle xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://dev.mysite.com/settings/settingsExchange"">" &
    4. "<Autoindex xmlns:d2p1=""http://dev.mysite.com/settings/workflows/autoindex"">" &
    5. "<Header xmlns=""http://dev.mysite.com/settings/bpsprocesses/common"">" &
    6. "<Guid xmlns=""http://dev.mysite.com/settings/interop"">0a3b7b31-907a-40bf-b55f-747046dc7ea2</Guid>" &
    7. "<ID xmlns=""http://dev.mysite.com/settings/interop"">413</ID>" &
    8. "<Name xmlns=""http://dev.mysite.com/settings/interop"">SD_CLEAR_STATUS</Name>" &
    9. "<Description xmlns=""http://dev.mysite.com/settings/interop"">Löscht die Einträge im Statusfeld</Description>" &
    10. "</Header>" &
    11. "</Autoindex>" &
    12. "</AutoindexBundle>"
    13. Dim doc As XDocument = XDocument.Parse(xmlContent)
    14. ' Definieren der Namensräume
    15. Dim nsExchange As XNamespace = "http://dev.mysite.com/settings/settingsExchange"
    16. Dim nsCommon As XNamespace = "http://dev.mysite.com/settings/bpsprocesses/common"
    17. Dim nsInterop As XNamespace = "http://dev.mysite.com/settings/interop"
    18. ' Abfragen unter Berücksichtigung der Namensräume
    19. Dim autoindex As XElement = doc.Root.Element(nsExchange + "Autoindex")
    20. Dim header1 As XElement = doc.Root.Element(nsExchange + "Autoindex").Element(nsCommon + "Header")
    21. Dim header2 As XElement = autoindex.Element(nsCommon + "Header")
    22. ' Überprüfen, ob die Knoten gefunden wurden
    23. If header1 IsNot Nothing Then
    24. Console.WriteLine("Header1 found")
    25. Else
    26. Console.WriteLine("Header1 not found")
    27. End If
    28. If header2 IsNot Nothing Then
    29. Console.WriteLine("Header2 found")
    30. Else
    31. Console.WriteLine("Header2 not found")
    32. End If
    33. ' Falls header1 und header2 nicht Nothing sind, die Werte auslesen
    34. If header1 IsNot Nothing Then
    35. Dim guid As String = header1.Element(nsInterop + "Guid").Value
    36. Dim id As String = header1.Element(nsInterop + "ID").Value
    37. Dim name As String = header1.Element(nsInterop + "Name").Value
    38. Dim description As String = header1.Element(nsInterop + "Description").Value
    39. Console.WriteLine("Guid: " & guid)
    40. Console.WriteLine("ID: " & id)
    41. Console.WriteLine("Name: " & name)
    42. Console.WriteLine("Description: " & description)
    43. End If
    44. Console.ReadKey()
    45. End Sub
    46. End Module


    Danke, das Beispiel 2 xDocument habe ich gerade mal auf meine Datei getestet und bis auf "description" klappt es super. In meiner Datei fehlt bei "description" auch der zusätzliche Namespace (siehe oben), bei dir ist er aber vorhanden.
    Aber egal ob ich den ns in der Zeile angebe oder nicht, ich bekomme hier immer eine System.NullReferenceException: "Object reference not set to an instance of an object."
    Oder man kann sich Klassen erstellen:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. <XmlRoot(ElementName:="Guid")>
    2. Public Class Guid
    3. <XmlAttribute(AttributeName:="xmlns")>
    4. Public Property Xmlns As String
    5. <XmlText>
    6. Public Property Text As String
    7. End Class
    8. <XmlRoot(ElementName:="ID")>
    9. Public Class ID
    10. <XmlAttribute(AttributeName:="xmlns")>
    11. Public Property Xmlns As String
    12. <XmlText>
    13. Public Property Text As Integer
    14. End Class
    15. <XmlRoot(ElementName:="Name")>
    16. Public Class Name
    17. <XmlAttribute(AttributeName:="xmlns")>
    18. Public Property Xmlns As String
    19. <XmlText>
    20. Public Property Text As String
    21. End Class
    22. <XmlRoot(ElementName:="Header")>
    23. Public Class Header
    24. <XmlElement(ElementName:="Guid")>
    25. Public Property Guid As Guid
    26. <XmlElement(ElementName:="ID")>
    27. Public Property ID As ID
    28. <XmlElement(ElementName:="Name")>
    29. Public Property Name As Name
    30. <XmlElement(ElementName:="Description")>
    31. Public Property Description As String
    32. <XmlAttribute(AttributeName:="xmlns")>
    33. Public Property Xmlns As String
    34. <XmlText>
    35. Public Property Text As String
    36. End Class
    37. <XmlRoot(ElementName:="Autoindex")>
    38. Public Class Autoindex
    39. <XmlElement(ElementName:="Header")>
    40. Public Property Header As Header
    41. <XmlAttribute(AttributeName:="d2p1")>
    42. Public Property D2p1 As String
    43. <XmlText>
    44. Public Property Text As String
    45. End Class
    46. <XmlRoot(ElementName:="AutoindexBundle")>
    47. Public Class AutoindexBundle
    48. <XmlElement(ElementName:="Autoindex")>
    49. Public Property Autoindex As Autoindex
    50. <XmlAttribute(AttributeName:="i")>
    51. Public Property I As String
    52. <XmlAttribute(AttributeName:="xmlns")>
    53. Public Property Xmlns As String
    54. <XmlText>
    55. Public Property Text As String
    56. End Class



    ..und dann:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim serializer As New XmlSerializer(GetType(AutoindexBundle))
    2. Using reader As New StringReader(xml)
    3. Dim test As AutoindexBundle = CType(serializer.Deserialize(reader), AutoindexBundle)
    4. End Using

    OK, danke ich schau mir das am WE mal genauer an. Scheint mir aber ganz schön aufwendig ;) Ich habe da einige hundert Dateien in über 20 Kategorien zu analysiere und jede Kategorie ist anders aufgebaut und hat andere Namensräume. Der Aufbau ist mit Sicherheit über die Links(die sind hier von mir unkenntlich gemacht) in den Namensräumen erklärt, da komme ich aber leider nicht ran. Ich werde mir wohl oder übel die Definitionen nachbauen müssen oder gibt es ein Tool oder Skript mit dem man das automatisiert machen kann?

    Hofi1609 schrieb:

    Ich habe da einige hundert Dateien in über 20 Kategorien zu analysiere und jede Kategorie ist anders aufgebaut und hat andere Namensräume.
    Wer hat die Dateien geschrieben?
    Wenn die Grundstruktur gleich ist, und damit meine ich, dass da z.B. ein Double-Wert ODER ein Double-Array ODER ein Integer-Wert ODER ein Integer-Array usw. stehen kann, ist es sinnvoll, Dir vom Studio eine Klasse bauen zu lassen.
    Dann musst Du die XML-Datei so umbauen, dass da ein Double-Wert UND ein Double-Array UND ein Integer-Wert UND ein Integer-Array usw. steht.
    Danach lässt Du Dir die Klasse generieren und testest die Konvertierung an möglichst allen vorrätigen XML-Dateien.
    Lies sie ein, schreibe sie auf Platte und vergleiche die Inhalte.
    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!

    RodFromGermany schrieb:

    Wer hat die Dateien geschrieben?


    Ich betreue und erweitere ein DMS eines externen Anbieters für meinen Arbeitgeber, dazu gehört das ständige Anpassen und Erweitern von Konfigurationen, Workflows, etc. Leider bietet diese SW wenig Möglichkeiten zur Dokumentation oder auch Versionsverwaltung für die Anpassungen. Einzige Möglichkeit ist ein regelmäßige Backup alle Konfigurationen, was auch sehr schnell und einfach geht. Eine Versionsverwaltung mache ich derzeit per Excel und die externe Dokumentation kann ich gar nicht so schnell aktualisieren wie die App geändert bzw. erweitert wird. In dem oben genanntem Backup sind aber in Form von sehr vielen XML-Dateien alle gewünschten Informationen erhalten. Ich wollte mir nun ein Tool bauen, mit dem ich, dass zu meinen Gunsten ausnutzen kann. Dazu ist es primär notwendig die vielen XML-Daten regelmäßig einzulesen um sie dann entsprechend auswerten zu können. Infos vom Hersteller der SW gibt es dazu keine.

    Morrison schrieb:

    Oder man kann sich Klassen erstellen:


    Mit deinem Code komm ich leider nicht so richtig klar (Ich bin eher Admin als Programmierer ;) ). Ich kann mir doch in VS2022 zu jeder XML-Version automatisch eine Klasse erstellen lassen, was ich auch an einem Beispiel getan habe. Nur komme ich nun nicht weiter, wie kann ich die erstelle Klasse nutzen um die Daten aus der dazugehörigen XML-Date lesen zu können?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Public Class AutoindexBundle
    2. ' HINWEIS: Für den generierten Code ist möglicherweise mindestens .NET Framework 4.5 oder .NET Core/Standard 2.0 erforderlich.
    3. '''<remarks/>
    4. <System.SerializableAttribute(),
    5. System.ComponentModel.DesignerCategoryAttribute("code"),
    6. System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True, [Namespace]:="http://dev.mysite.com/settings/settingsExchange"),
    7. System.Xml.Serialization.XmlRootAttribute([Namespace]:="http://dev.mysite.com/settings/settingsExchange", IsNullable:=False)>
    8. Partial Public Class AutoindexBundle
    9. Private autoindexField As AutoindexBundleAutoindex
    10. Private guidField As String
    11. Private ruleField As Object
    12. Private scheduleSettingsField As AutoindexBundleScheduleSettings
    13. '''<remarks/>
    14. Public Property Autoindex() As AutoindexBundleAutoindex
    15. Get
    16. Return Me.autoindexField
    17. End Get
    18. Set
    19. Me.autoindexField = Value
    20. End Set
    21. End Property
    22. '''<remarks/>
    23. Public Property Guid() As String
    24. Get
    25. Return Me.guidField
    26. End Get
    27. Set
    28. Me.guidField = Value
    29. End Set
    30. End Property
    31. '''<remarks/>
    32. <System.Xml.Serialization.XmlElementAttribute(IsNullable:=True)>
    33. Public Property Rule() As Object
    34. Get
    35. Return Me.ruleField
    36. End Get
    37. Set
    38. Me.ruleField = Value
    39. End Set
    40. End Property
    41. '''<remarks/>
    42. Public Property ScheduleSettings() As AutoindexBundleScheduleSettings
    43. Get
    44. Return Me.scheduleSettingsField
    45. End Get
    46. Set
    47. Me.scheduleSettingsField = Value
    48. End Set
    49. End Property
    50. End Class
    51. '''<remarks/>
    52. <System.SerializableAttribute(),
    53. System.ComponentModel.DesignerCategoryAttribute("code"),
    54. System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True, [Namespace]:="http://dev.mysite.com/settings/settingsExchange")>
    55. Partial Public Class AutoindexBundleAutoindex
    56. Private headerField As Header
    57. Private aIMatchOptionSettingsField As AIMatchOptionSettings
    58. Private extDBActionsField As ExtDBActions
    59. Private extDBSourceField As ExtDBSource
    60. Private externalDataSourceTypeField As String
    61. Private fCActionsField As FCActions
    62. Private fCSourceField As FCSource
    63. Private iteratedRecordsAreInField As String
    64. Private ruleGuidField As String
    65. Private versionField As String
    66. '''<remarks/>
    67. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/bpsprocesses/common")>
    68. Public Property Header() As Header
    69. Get
    70. Return Me.headerField
    71. End Get
    72. Set
    73. Me.headerField = Value
    74. End Set
    75. End Property
    76. '''<remarks/>
    77. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/workflows/autoindex")>
    78. Public Property AIMatchOptionSettings() As AIMatchOptionSettings
    79. Get
    80. Return Me.aIMatchOptionSettingsField
    81. End Get
    82. Set
    83. Me.aIMatchOptionSettingsField = Value
    84. End Set
    85. End Property
    86. '''<remarks/>
    87. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/workflows/autoindex")>
    88. Public Property ExtDBActions() As ExtDBActions
    89. Get
    90. Return Me.extDBActionsField
    91. End Get
    92. Set
    93. Me.extDBActionsField = Value
    94. End Set
    95. End Property
    96. '''<remarks/>
    97. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/workflows/autoindex")>
    98. Public Property ExtDBSource() As ExtDBSource
    99. Get
    100. Return Me.extDBSourceField
    101. End Get
    102. Set
    103. Me.extDBSourceField = Value
    104. End Set
    105. End Property
    106. '''<remarks/>
    107. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/workflows/autoindex")>
    108. Public Property ExternalDataSourceType() As String
    109. Get
    110. Return Me.externalDataSourceTypeField
    111. End Get
    112. Set
    113. Me.externalDataSourceTypeField = Value
    114. End Set
    115. End Property
    116. '''<remarks/>
    117. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/workflows/autoindex")>
    118. Public Property FCActions() As FCActions
    119. Get
    120. Return Me.fCActionsField
    121. End Get
    122. Set
    123. Me.fCActionsField = Value
    124. End Set
    125. End Property
    126. '''<remarks/>
    127. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/workflows/autoindex")>
    128. Public Property FCSource() As FCSource
    129. Get
    130. Return Me.fCSourceField
    131. End Get
    132. Set
    133. Me.fCSourceField = Value
    134. End Set
    135. End Property
    136. '''<remarks/>
    137. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/workflows/autoindex")>
    138. Public Property IteratedRecordsAreIn() As String
    139. Get
    140. Return Me.iteratedRecordsAreInField
    141. End Get
    142. Set
    143. Me.iteratedRecordsAreInField = Value
    144. End Set
    145. End Property
    146. '''<remarks/>
    147. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/workflows/autoindex")>
    148. Public Property RuleGuid() As String
    149. Get
    150. Return Me.ruleGuidField
    151. End Get
    152. Set
    153. Me.ruleGuidField = Value
    154. End Set
    155. End Property
    156. '''<remarks/>
    157. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/workflows/autoindex")>
    158. Public Property Version() As String
    159. Get
    160. Return Me.versionField
    161. End Get
    162. Set
    163. Me.versionField = Value
    164. End Set
    165. End Property
    166. End Class
    167. '''<remarks/>
    168. <System.SerializableAttribute(),
    169. System.ComponentModel.DesignerCategoryAttribute("code"),
    170. System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True, [Namespace]:="http://dev.mysite.com/settings/bpsprocesses/common"),
    171. System.Xml.Serialization.XmlRootAttribute([Namespace]:="http://dev.mysite.com/settings/bpsprocesses/common", IsNullable:=False)>
    172. Partial Public Class Header
    173. Private guidField As String
    174. Private idField As UShort
    175. Private nameField As String
    176. Private descriptionField As String
    177. '''<remarks/>
    178. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/interop")>
    179. Public Property Guid() As String
    180. Get
    181. Return Me.guidField
    182. End Get
    183. Set
    184. Me.guidField = Value
    185. End Set
    186. End Property
    187. '''<remarks/>
    188. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/interop")>
    189. Public Property ID() As UShort
    190. Get
    191. Return Me.idField
    192. End Get
    193. Set
    194. Me.idField = Value
    195. End Set
    196. End Property
    197. '''<remarks/>
    198. <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://dev.mysite.com/settings/interop")>
    199. Public Property Name() As String
    200. Get
    201. Return Me.nameField
    202. End Get
    203. Set
    204. Me.nameField = Value
    205. End Set
    206. End Property
    207. '''<remarks/>
    208. Public Property Description() As String
    209. Get
    210. Return Me.descriptionField
    211. End Get
    212. Set
    213. Me.descriptionField = Value
    214. End Set
    215. End Property
    216. End Class
    217. '''<remarks/>
    218. .
    219. .
    220. .

    Haudruferzappeltnoch schrieb:

    XmlSerializer.Deserialize


    Ja, das hat Morrison ja schon im Post #4 geschrieben. Aber leider bekomme ich das mit der automatisch erzeugten Klasse (siehe Post #7) nicht hin.
    Ich habe folgenden Code versucht:

    VB.NET-Quellcode

    1. Private Sub DeserializeObject(ByVal filename As String)
    2. Console.WriteLine("Reading with XmlReader")
    3. Dim serializer As New XmlSerializer(GetType(AutoindexBundle.Header))
    4. Dim fs As New FileStream(filename, FileMode.Open)
    5. Dim reader As XmlReader = XmlReader.Create(fs)
    6. Dim test As AutoindexBundle.Header
    7. test = CType(serializer.Deserialize(reader), AutoindexBundle.Header)
    8. fs.Close()
    9. Console.Write(test.Guid & ControlChars.Tab &
    10. test.ID & ControlChars.Tab &
    11. test.Name & ControlChars.Tab &
    12. test.Description & ControlChars.Tab)
    13. End Sub


    Aber leider erhalte ich hier in de Zeile test = CType(.... folgende Fehlermeldungen:
    System.InvalidOperationException: "There is an error in XML document (1, 40)."
    Innere Ausnahme 1:
    InvalidOperationException: <AutoindexBundle xmlns='http://dev.mysite.com/settings/settingsExchange'> was not expected.
    Hat keine eine Idee, wo hier das Problem liegt? Ich hab schon alles mögliche versucht und auch jede Menge gelesen aber alle Beispiele sind viel flacher und decken mein Problem nicht wirklich auf. Der Fehlermeldung zu Folge soll das Problem in der XML-Datei liegen, da kann ich aber keinen Fehler erkennen.
    Hier nochmal eine verkürzte Datei, ich hab nur sich widerholende Elemente in <d2p1:DSFields> entfernt:
    Spoiler anzeigen

    XML-Quellcode

    1. <AutoindexBundle xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://dev.mysite.com/settings/settingsExchange">
    2. <Autoindex xmlns:d2p1="http://dev.mysite.com/settings/workflows/autoindex">
    3. <Header xmlns="http://dev.mysite.com/settings/bpsprocesses/common">
    4. <Guid xmlns="http://dev.mysite.com/settings/interop">978094cb-6cb5-4782-afdd-bf4cd11cf4ba</Guid>
    5. <ID xmlns="http://dev.mysite.com/settings/interop">469</ID>
    6. <Name xmlns="http://dev.mysite.com/settings/interop">X_SD_CLEAR_DEL</Name>
    7. <Description>Löscht die Einträge im Statusfeld</Description>
    8. </Header>
    9. <d2p1:AIMatchOptionSettings>
    10. <d2p1:MatchCodes/>
    11. <d2p1:MultiMatchMode>NoMatch</d2p1:MultiMatchMode>
    12. </d2p1:AIMatchOptionSettings>
    13. <d2p1:ExtDBActions>
    14. <d2p1:MatchActions>
    15. <d2p1:DeleteRow>false</d2p1:DeleteRow>
    16. <d2p1:Fields/>
    17. </d2p1:MatchActions>
    18. <d2p1:NoMatchActions>
    19. <d2p1:Fields/>
    20. <d2p1:InsertRow>false</d2p1:InsertRow>
    21. </d2p1:NoMatchActions>
    22. </d2p1:ExtDBActions>
    23. <d2p1:ExtDBSource>
    24. <d2p1:AIDataSource i:type="d2p1:FixedEntriesDataSource">
    25. <d2p1:DSGuid>00000000-0000-0000-0000-000000000000</d2p1:DSGuid>
    26. <d2p1:SourceName i:nil="true"/>
    27. </d2p1:AIDataSource>
    28. <d2p1:DSFields/>
    29. <d2p1:FilterOption>AllDocuments</d2p1:FilterOption>
    30. <d2p1:UsedFilter xmlns:d4p1="http://dev.mysite.com/settings/filter">
    31. <d4p1:Condition i:nil="true"/>
    32. <d4p1:Logic>And</d4p1:Logic>
    33. </d2p1:UsedFilter>
    34. </d2p1:ExtDBSource>
    35. <d2p1:ExternalDataSourceType>FixedEntries</d2p1:ExternalDataSourceType>
    36. <d2p1:FCActions>
    37. <d2p1:MatchActions>
    38. <d2p1:DeleteRow>false</d2p1:DeleteRow>
    39. <d2p1:Fields>
    40. <d2p1:IndexField i:type="d2p1:IndexDeletion">
    41. <d2p1:Field>DEL</d2p1:Field>
    42. <d2p1:Value i:nil="true"/>
    43. </d2p1:IndexField>
    44. </d2p1:Fields>
    45. </d2p1:MatchActions>
    46. <d2p1:NoMatchActions>
    47. <d2p1:Fields/>
    48. <d2p1:InsertRow>false</d2p1:InsertRow>
    49. </d2p1:NoMatchActions>
    50. </d2p1:FCActions>
    51. <d2p1:FCSource>
    52. <d2p1:AIDataSource i:type="d2p1:FileCabinetDataSource">
    53. <d2p1:DSGuid>0c3b26ac-305e-48c5-952b-6aee1518cd50</d2p1:DSGuid>
    54. <d2p1:SourceName>Stammdaten</d2p1:SourceName>
    55. <d2p1:UserLogin>
    56. <d2p1:ComputerAddress i:nil="true"/>
    57. <d2p1:IsFixedLogin>true</d2p1:IsFixedLogin>
    58. <d2p1:IsLoggedInOtherSystem>false</d2p1:IsLoggedInOtherSystem>
    59. <d2p1:Organization>myBusiness</d2p1:Organization>
    60. <d2p1:Password i:nil="true"/>
    61. <d2p1:Port>0</d2p1:Port>
    62. <d2p1:ReadOnly>false</d2p1:ReadOnly>
    63. <d2p1:Token i:nil="true"/>
    64. <d2p1:User>Mustermann</d2p1:User>
    65. <d2p1:UserGuid>3e90584f-ec45-4a94-b6dc-1216e3b3143e</d2p1:UserGuid>
    66. </d2p1:UserLogin>
    67. </d2p1:AIDataSource>
    68. <d2p1:DSFields>
    69. <d2p1:DataSourceField>
    70. <d2p1:DisplayName>ADRESSNUMMER</d2p1:DisplayName>
    71. <d2p1:InternalType>Normal</d2p1:InternalType>
    72. <d2p1:IsReadonly>false</d2p1:IsReadonly>
    73. <d2p1:Length>-1</d2p1:Length>
    74. <d2p1:Name>ADRESSNUMMER</d2p1:Name>
    75. <d2p1:Type>Text</d2p1:Type>
    76. </d2p1:DataSourceField>
    77. <d2p1:DataSourceField>
    78. <d2p1:DisplayName>NAME_1</d2p1:DisplayName>
    79. <d2p1:InternalType>Normal</d2p1:InternalType>
    80. <d2p1:IsReadonly>false</d2p1:IsReadonly>
    81. <d2p1:Length>-1</d2p1:Length>
    82. <d2p1:Name>NAME_1</d2p1:Name>
    83. <d2p1:Type>Text</d2p1:Type>
    84. </d2p1:DataSourceField>
    85. <d2p1:DataSourceField>
    86. <d2p1:DisplayName>NAME_2</d2p1:DisplayName>
    87. <d2p1:InternalType>Normal</d2p1:InternalType>
    88. <d2p1:IsReadonly>false</d2p1:IsReadonly>
    89. <d2p1:Length>-1</d2p1:Length>
    90. <d2p1:Name>NAME_2</d2p1:Name>
    91. <d2p1:Type>Text</d2p1:Type>
    92. </d2p1:DataSourceField>
    93. <d2p1:DataSourceField>
    94. <d2p1:DisplayName>NAME_3</d2p1:DisplayName>
    95. <d2p1:InternalType>Normal</d2p1:InternalType>
    96. <d2p1:IsReadonly>false</d2p1:IsReadonly>
    97. <d2p1:Length>-1</d2p1:Length>
    98. <d2p1:Name>NAME_3</d2p1:Name>
    99. <d2p1:Type>Text</d2p1:Type>
    100. </d2p1:DataSourceField>
    101. <d2p1:DataSourceField>
    102. <d2p1:DisplayName>NAME_4</d2p1:DisplayName>
    103. <d2p1:InternalType>Normal</d2p1:InternalType>
    104. <d2p1:IsReadonly>false</d2p1:IsReadonly>
    105. <d2p1:Length>-1</d2p1:Length>
    106. <d2p1:Name>NAME_4</d2p1:Name>
    107. <d2p1:Type>Text</d2p1:Type>
    108. </d2p1:DataSourceField>
    109. <d2p1:DataSourceField>
    110. <d2p1:DisplayName>MATCHCODE</d2p1:DisplayName>
    111. <d2p1:InternalType>Normal</d2p1:InternalType>
    112. <d2p1:IsReadonly>false</d2p1:IsReadonly>
    113. <d2p1:Length>-1</d2p1:Length>
    114. <d2p1:Name>MATCHCODE</d2p1:Name>
    115. <d2p1:Type>Text</d2p1:Type>
    116. </d2p1:DataSourceField>
    117. </d2p1:DSFields>
    118. <d2p1:FilterOption>Filter</d2p1:FilterOption>
    119. <d2p1:UsedFilter xmlns:d4p1="http://dev.mysite.com/settings/filter">
    120. <d4p1:Condition i:type="d4p1:ExtendedCondition">
    121. <d4p1:ExtendedQuery xmlns:d6p1="http://dev.mysite.com/settings/web/querybuilder">
    122. <d6p1:Root>
    123. <d6p1:Conditions>
    124. <d6p1:BaseCondition i:type="d6p1:Condition">
    125. <d6p1:DBName>DEL</d6p1:DBName>
    126. <d6p1:Provider i:type="d6p1:EmptyConditionProvider">
    127. <d6p1:Operation>NotEmpty</d6p1:Operation>
    128. </d6p1:Provider>
    129. </d6p1:BaseCondition>
    130. </d6p1:Conditions>
    131. <d6p1:Operation>Or</d6p1:Operation>
    132. </d6p1:Root>
    133. </d4p1:ExtendedQuery>
    134. </d4p1:Condition>
    135. <d4p1:Logic>And</d4p1:Logic>
    136. </d2p1:UsedFilter>
    137. </d2p1:FCSource>
    138. <d2p1:IteratedRecordsAreIn>FileCabinet</d2p1:IteratedRecordsAreIn>
    139. <d2p1:RuleGuid>00000000-0000-0000-0000-000000000000</d2p1:RuleGuid>
    140. <d2p1:Version>5.1.0.1</d2p1:Version>
    141. </Autoindex>
    142. <Guid>978094cb-6cb5-4782-afdd-bf4cd11cf4ba</Guid>
    143. <Rule xmlns:d2p1="http://dev.mysite.com/settings/notification" i:nil="true"/>
    144. <ScheduleSettings xmlns:d2p1="http://dev.mysite.com/settings/common/dwschedule" i:nil="true"/>
    145. </AutoindexBundle>```​


    Ich hoffe es findet sich jemand, der mir hier mit ein paar nützlichen Tipps auf die Sprünge helfen kann. Schon mal Danke im Voraus. :)
    Kannst du zu Post 2 und 3 nochmal genau sagen was klappt und was nicht? Da war deine Fehlermeldung zumindest noch ne andere.

    Hofi1609 schrieb:

    soll das Problem in der XML-Datei liegen, da kann ich aber keinen Fehler erkennen.
    Bin was Xml-Format-Regeln angeht raus. Wenn der Serializer sagt "da isn fehler", glaub ich ihm das aufs Wort. Woran machst du es fest, dass die xml "in Ordnung" ist?

    Wie wär es außerdem mit reverse engineeren? Ein Objekt bauen wie du es brauchst und dann serialisieren, vielleicht fürn Vergleich.
    Bei mir geht dieses:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports <xmlns="http://dev.mysite.com/settings/settingsExchange">
    2. Imports <xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    3. Imports <xmlns:d2p1="http://dev.mysite.com/bpw">
    4. Imports <xmlns:hdr="http://dev.mysite.com/settings/bpsprocesses/common">
    5. Public Class frmXDocTryal1
    6. Dim xDoc As XElement = <AutoindexBundle xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://dev.mysite.com/settings/settingsExchange">
    7. <Autoindex xmlns:d2p1="http://dev.mysite.com/settings/workflows/autoindex">
    8. <Header xmlns="http://dev.mysite.com/settings/bpsprocesses/common">
    9. <Guid xmlns="http://dev.mysite.com/settings/interop">978094cb-6cb5-4782-afdd-bf4cd11cf4ba</Guid>
    10. <ID xmlns="http://dev.mysite.com/settings/interop">469</ID>
    11. <Name xmlns="http://dev.mysite.com/settings/interop">X_SD_CLEAR_DEL</Name>
    12. <Description>Löscht die Einträge im Statusfeld</Description>
    13. </Header>
    14. <d2p1:AIMatchOptionSettings>
    15. <d2p1:MatchCodes/>
    16. <d2p1:MultiMatchMode>NoMatch</d2p1:MultiMatchMode>
    17. </d2p1:AIMatchOptionSettings>
    18. <d2p1:ExtDBActions>
    19. <d2p1:MatchActions>
    20. <d2p1:DeleteRow>false</d2p1:DeleteRow>
    21. <d2p1:Fields/>
    22. </d2p1:MatchActions>
    23. <d2p1:NoMatchActions>
    24. <d2p1:Fields/>
    25. <d2p1:InsertRow>false</d2p1:InsertRow>
    26. </d2p1:NoMatchActions>
    27. </d2p1:ExtDBActions>
    28. <d2p1:ExtDBSource>
    29. <d2p1:AIDataSource i:type="d2p1:FixedEntriesDataSource">
    30. <d2p1:DSGuid>00000000-0000-0000-0000-000000000000</d2p1:DSGuid>
    31. <d2p1:SourceName i:nil="true"/>
    32. </d2p1:AIDataSource>
    33. <d2p1:DSFields/>
    34. <d2p1:FilterOption>AllDocuments</d2p1:FilterOption>
    35. <d2p1:UsedFilter xmlns:d4p1="http://dev.mysite.com/settings/filter">
    36. <d4p1:Condition i:nil="true"/>
    37. <d4p1:Logic>And</d4p1:Logic>
    38. </d2p1:UsedFilter>
    39. </d2p1:ExtDBSource>
    40. <d2p1:ExternalDataSourceType>FixedEntries</d2p1:ExternalDataSourceType>
    41. <d2p1:FCActions>
    42. <d2p1:MatchActions>
    43. <d2p1:DeleteRow>false</d2p1:DeleteRow>
    44. <d2p1:Fields>
    45. <d2p1:IndexField i:type="d2p1:IndexDeletion">
    46. <d2p1:Field>DEL</d2p1:Field>
    47. <d2p1:Value i:nil="true"/>
    48. </d2p1:IndexField>
    49. </d2p1:Fields>
    50. </d2p1:MatchActions>
    51. <d2p1:NoMatchActions>
    52. <d2p1:Fields/>
    53. <d2p1:InsertRow>false</d2p1:InsertRow>
    54. </d2p1:NoMatchActions>
    55. </d2p1:FCActions>
    56. <d2p1:FCSource>
    57. <d2p1:AIDataSource i:type="d2p1:FileCabinetDataSource">
    58. <d2p1:DSGuid>0c3b26ac-305e-48c5-952b-6aee1518cd50</d2p1:DSGuid>
    59. <d2p1:SourceName>Stammdaten</d2p1:SourceName>
    60. <d2p1:UserLogin>
    61. <d2p1:ComputerAddress i:nil="true"/>
    62. <d2p1:IsFixedLogin>true</d2p1:IsFixedLogin>
    63. <d2p1:IsLoggedInOtherSystem>false</d2p1:IsLoggedInOtherSystem>
    64. <d2p1:Organization>myBusiness</d2p1:Organization>
    65. <d2p1:Password i:nil="true"/>
    66. <d2p1:Port>0</d2p1:Port>
    67. <d2p1:ReadOnly>false</d2p1:ReadOnly>
    68. <d2p1:Token i:nil="true"/>
    69. <d2p1:User>Mustermann</d2p1:User>
    70. <d2p1:UserGuid>3e90584f-ec45-4a94-b6dc-1216e3b3143e</d2p1:UserGuid>
    71. </d2p1:UserLogin>
    72. </d2p1:AIDataSource>
    73. <d2p1:DSFields>
    74. <d2p1:DataSourceField>
    75. <d2p1:DisplayName>ADRESSNUMMER</d2p1:DisplayName>
    76. <d2p1:InternalType>Normal</d2p1:InternalType>
    77. <d2p1:IsReadonly>false</d2p1:IsReadonly>
    78. <d2p1:Length>-1</d2p1:Length>
    79. <d2p1:Name>ADRESSNUMMER</d2p1:Name>
    80. <d2p1:Type>Text</d2p1:Type>
    81. </d2p1:DataSourceField>
    82. <d2p1:DataSourceField>
    83. <d2p1:DisplayName>NAME_1</d2p1:DisplayName>
    84. <d2p1:InternalType>Normal</d2p1:InternalType>
    85. <d2p1:IsReadonly>false</d2p1:IsReadonly>
    86. <d2p1:Length>-1</d2p1:Length>
    87. <d2p1:Name>NAME_1</d2p1:Name>
    88. <d2p1:Type>Text</d2p1:Type>
    89. </d2p1:DataSourceField>
    90. <d2p1:DataSourceField>
    91. <d2p1:DisplayName>NAME_2</d2p1:DisplayName>
    92. <d2p1:InternalType>Normal</d2p1:InternalType>
    93. <d2p1:IsReadonly>false</d2p1:IsReadonly>
    94. <d2p1:Length>-1</d2p1:Length>
    95. <d2p1:Name>NAME_2</d2p1:Name>
    96. <d2p1:Type>Text</d2p1:Type>
    97. </d2p1:DataSourceField>
    98. <d2p1:DataSourceField>
    99. <d2p1:DisplayName>NAME_3</d2p1:DisplayName>
    100. <d2p1:InternalType>Normal</d2p1:InternalType>
    101. <d2p1:IsReadonly>false</d2p1:IsReadonly>
    102. <d2p1:Length>-1</d2p1:Length>
    103. <d2p1:Name>NAME_3</d2p1:Name>
    104. <d2p1:Type>Text</d2p1:Type>
    105. </d2p1:DataSourceField>
    106. <d2p1:DataSourceField>
    107. <d2p1:DisplayName>NAME_4</d2p1:DisplayName>
    108. <d2p1:InternalType>Normal</d2p1:InternalType>
    109. <d2p1:IsReadonly>false</d2p1:IsReadonly>
    110. <d2p1:Length>-1</d2p1:Length>
    111. <d2p1:Name>NAME_4</d2p1:Name>
    112. <d2p1:Type>Text</d2p1:Type>
    113. </d2p1:DataSourceField>
    114. <d2p1:DataSourceField>
    115. <d2p1:DisplayName>MATCHCODE</d2p1:DisplayName>
    116. <d2p1:InternalType>Normal</d2p1:InternalType>
    117. <d2p1:IsReadonly>false</d2p1:IsReadonly>
    118. <d2p1:Length>-1</d2p1:Length>
    119. <d2p1:Name>MATCHCODE</d2p1:Name>
    120. <d2p1:Type>Text</d2p1:Type>
    121. </d2p1:DataSourceField>
    122. </d2p1:DSFields>
    123. <d2p1:FilterOption>Filter</d2p1:FilterOption>
    124. <d2p1:UsedFilter xmlns:d4p1="http://dev.mysite.com/settings/filter">
    125. <d4p1:Condition i:type="d4p1:ExtendedCondition">
    126. <d4p1:ExtendedQuery xmlns:d6p1="http://dev.mysite.com/settings/web/querybuilder">
    127. <d6p1:Root>
    128. <d6p1:Conditions>
    129. <d6p1:BaseCondition i:type="d6p1:Condition">
    130. <d6p1:DBName>DEL</d6p1:DBName>
    131. <d6p1:Provider i:type="d6p1:EmptyConditionProvider">
    132. <d6p1:Operation>NotEmpty</d6p1:Operation>
    133. </d6p1:Provider>
    134. </d6p1:BaseCondition>
    135. </d6p1:Conditions>
    136. <d6p1:Operation>Or</d6p1:Operation>
    137. </d6p1:Root>
    138. </d4p1:ExtendedQuery>
    139. </d4p1:Condition>
    140. <d4p1:Logic>And</d4p1:Logic>
    141. </d2p1:UsedFilter>
    142. </d2p1:FCSource>
    143. <d2p1:IteratedRecordsAreIn>FileCabinet</d2p1:IteratedRecordsAreIn>
    144. <d2p1:RuleGuid>00000000-0000-0000-0000-000000000000</d2p1:RuleGuid>
    145. <d2p1:Version>5.1.0.1</d2p1:Version>
    146. </Autoindex>
    147. <Guid>978094cb-6cb5-4782-afdd-bf4cd11cf4ba</Guid>
    148. <Rule xmlns:d2p1="http://dev.mysite.com/settings/notification" i:nil="true"/>
    149. <ScheduleSettings xmlns:d2p1="http://dev.mysite.com/settings/common/dwschedule" i:nil="true"/>
    150. </AutoindexBundle>
    151. #If False Then
    152. Dim xDoc As XElement = <AutoindexBundle xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://dev.mysite.com/settings/settingsExchange">
    153. <Autoindex xmlns:d2p1="http://dev.mysite.com/settings/workflows/autoindex">
    154. <Header xmlns="http://dev.mysite.com/settings/bpsprocesses/common">
    155. <Guid xmlns="http://dev.mysite.com/settings/interop">978094cb-6cb5-4782-afdd-bf4cd11cf4ba</Guid>
    156. <ID xmlns="http://dev.mysite.com/settings/interop">469</ID>
    157. <Name xmlns="http://dev.mysite.com/settings/interop">X_SD_CLEAR_DEL</Name>
    158. <Description>Löscht die Einträge im Statusfeld</Description>
    159. </Header>
    160. <d2p1:AIMatchOptionSettings>
    161. #End If
    162. Private Sub frmXDocTryal1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    163. Dim AutoindexBundle = xDoc.<AutoindexBundle>.FirstOrDefault
    164. Dim Autoindex = xDoc.<Autoindex>.FirstOrDefault
    165. Dim header = xDoc.<Autoindex>.<hdr:Header>.FirstOrDefault
    166. Dim x = 9 ' hier Haltepunkt
    167. End Sub
    168. End Class
    Am Haltepunkt ist header befüllt

    Neu

    ErfinderDesRades schrieb:

    Bei mir geht dieses:



    So etwas ähnliche hatte ich schon mit den originalen Dateien versucht, leider ohne Erfolg.
    Um Probleme bei den originalen Dateien auszuschließen, hab ich mir die hier gepostete verkürzte Version mal in eine test.xml Datei kopiert und folgendes versucht:

    VB.NET-Quellcode

    1. Dim doc As XDocument = XDocument.Load("C:\aaa\test.xml")
    2. Dim xdoc As XElement = doc.Root
    3. Dim AutoindexBundle = xDoc.<AutoindexBundle>.FirstOrDefault
    4. Dim Autoindex = xDoc.<Autoindex>.FirstOrDefault
    5. Dim header = xDoc.<Autoindex>.<hdr:Header>.FirstOrDefault
    6. Sorry, geht doch :-) Ich hatte noch einen Fehler in den Namespace--Haltepunkt


    Am Haltepunkt haben die Variablen folgenden Inhalt:
    doc = die komplette Datei
    xdoc = ebenfalls die komplette Datei
    AutoindexBundle = Nothing
    Autoindex = Das Element Autoindex komplett
    header = Nothing

    Genau da liegt ja mein Problem, egal wie ich das ganze aufbaue oder Abfrage, header ist immer Nothing. :(
    Sorry, geht doch! :) Ich hatte noch einen Fehler in den Namespaces.
    Wenn man nun die Namespaces noch um folgende Zeile ergänzt, kann man auch die einzelnen Elemente von header auslesen:

    VB.NET-Quellcode

    1. Imports <xmlns:int="http://dev.mysites.com/settings/interop">
    2. Dim sName As String = header.<int:Name>.Value​

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Hofi1609“ ()

    Neu

    Morrison schrieb:

    Bei meinem Post #2



    Ja, das hatte ich getestet.
    Da ich aber einige hundert dieser Dateien mit verschiedenem Aufbau habe und diese sich auch regelmäßig ändern, suche ich noch nach einer einfacheren ;) Lösung.

    Die Dateien stehen in mehreren Unterordner, wobei in jedem Unterordner ein anderer Aufbau der Dateien existiert. Ich will die Ordner alle rekursiv durchlaufen und dabei alle Inhalte auslesen und einige sogar ändern.
    Hinzu kommt, das diese Dateien auch noch regelmäßig geändert und wieder neu eingelesen werden müssen. Ich versuch so viel wie möglich zu Automatisieren, was aber nur geht, wenn ich die kompletten Inhalte aller Dateien Fehlerfrei durchlaufen kann.
    Das mit dem header ist nur der erste Versuch - an dem ich schon gescheitert bin :(

    Neu

    Wenn sich das XML ändert hilft vllt. nur rekursives durchlaufen der Nodes!?:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim xmlContent As String = "<AutoindexBundle xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://dev.mysite.com/settings/settingsExchange"">" &
    4. "<Autoindex xmlns:d2p1=""http://dev.mysite.com/settings/workflows/autoindex"">" &
    5. "<Header xmlns=""http://dev.mysite.com/settings/bpsprocesses/common"">" &
    6. "<Guid xmlns=""http://dev.mysite.com/settings/interop"">0a3b7b31-907a-40bf-b55f-747046dc7ea2</Guid>" &
    7. "<ID xmlns=""http://dev.mysite.com/settings/interop"">413</ID>" &
    8. "<Name xmlns=""http://dev.mysite.com/settings/interop"">SD_CLEAR_STATUS</Name>" &
    9. "<Description xmlns=""http://dev.mysite.com/settings/interop"">Löscht die Einträge im Statusfeld</Description>" &
    10. "</Header>" &
    11. "</Autoindex>" &
    12. "</AutoindexBundle>"
    13. Dim doc As XDocument = XDocument.Parse(xmlContent)
    14. ' Rekursive Methode aufrufen
    15. TraverseNodes(doc.Root)
    16. End Sub
    17. Sub TraverseNodes(node As XElement)
    18. ' Ausgabe des aktuellen Knotens
    19. Debug.WriteLine($"Node: {node.Name}, Value: {node.Value}")
    20. ' Rekursiv durch alle untergeordneten Knoten gehen
    21. For Each child As XElement In node.Elements()
    22. TraverseNodes(child)
    23. Next
    24. End Sub
    25. End Module



    So kann man sich sämtliche Eigenschaften (ParentNode, Attributes, etc.) ausgeben lassen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Morrison“ ()

    Neu

    Morrison schrieb:

    rekursives durchlaufen der Nodes



    So etwas ähnliches versuche ich grade mit XPathNavigator. Ich werde deinen Code aber auch mal probieren.

    Aber die eigentliche Frage für mich lautet doch, wie funktioniert der korrekte Zugriff über die automatisch erstellte Klasse aus Post 7, dort stehen doch alle benötigten Informationen? Ich bekomme es einfach nicht hin.

    Neu

    Hofi1609 schrieb:

    Klasse aus Post 7, dort stehen doch alle benötigten Informationen?
    nö, der Code aus post#7 - da fehlen noch etliche Klassen.
    Das müsstest du erstmal vervollständigen, sodass es überhaupt kompiliert.
    Erst danach kann man überlegen, wie man dieses Datenmodell (das ist es nämlich: ein Datenmodell) aus einer Xml-Datei befüllt.
    Normalerweise ginge das ja einfach mit XDoc/XmlDocument.Load(), aber wenn deine Dateien von verschiedenerlei Struktur sind, muss man die sich angucken, ob man iwas findet, wie sie dennoch über einen Kamm zu scheren sind.
    Dabei ist rekursiv schoma ein Ansatz.
    Aber wie gesagt: Erstmal muss der Compiler das Datenmodell übersetzen können, sonst kann mans nicht befüllen.

    Neu

    ErfinderDesRades schrieb:

    nö, der Code aus post#7 - da fehlen noch etliche Klassen.

    Der Code aus Post 7 ist nur ein Auszug, die komplette Datei ist zu groß oder wie kann ich hier so großen Code posten?
    Ich habe 22 verschiedene Typen von xml-Dateien die nach Sichtung teilweise auch recht unterschiedlich aufgebaut sind. Ich dachte, wenn ich von jedem Typ eine eigene Klasse erstelle dann könnte ich damit arbeiten oder ist es besser diese Dateien rekursiv auszulesen und in eine neue einheitliche Struktur zu überführen?

    Neu

    Wenn du weisst, dasses 22 Typen sind, ist ja schoma was.
    Man müsste für jeden Typ so ein Klassen-System generieren was kompiliert.
    Und dann gucken, ob sich ein neues, grösseres Klassensystem händisch bauen lässt, wo alle Dinge aller dieser Typen unterkommen.
    Und dann gucken, ob sich Code schreiben lässt, der das iwie sinnvoll befüllen kann.

    Hofi1609 schrieb:

    wie kann ich hier so großen Code posten?
    kannste zippen und als Datei hier anhängen.