XML Routine beenden

  • VB.NET

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

    XML Routine beenden

    Hey,

    ich habe ein Problem. Innerhalb meines Programms soll eine XML Datei der Form:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <!--XML Database.-->
    3. <Data>
    4. <MaxMustermann>
    5. <Login1>11:30:56</Login1>
    6. <Logout1>11:30:56</Logout1>
    7. <Login2>11:31:00</Login2>
    8. <Logout2>11:31:01</Logout2>
    9. </MaxMustermann>


    ausgelesen werden. Das funktioniert soweit auch ganz gut. Mein Problem ist, dass ich später wieder in diese XML schreiben möchte (beim Abspeichern), dann aber der Fehler kommt, dass der Prozess auf diese Datei nicht zugreifen kann, da sie bereits verwendet wird.

    Hier der Code für die Ausleseroutine:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim array(5000) As String
    3. Dim array2(5000) As String
    4. Dim n As Integer = 1
    5. If (System.IO.File.Exists("P:\XML\" & Year(Now) & "-" & System.DateTime.Today.Month.ToString("#00") & ".xml")) Then
    6. Dim document As XmlReader = New XmlTextReader("P:\XML\" & Year(Now) & "-" & System.DateTime.Today.Month.ToString("#00") & ".xml")
    7. While (document.Read())
    8. Dim type = document.NodeType
    9. If (type = XmlNodeType.Element) Then
    10.  
    11. If (document.Name = "Login" & n) Then
    12. xmlMyname.Visible = True
    13. xmlMyname.Text = document.ReadInnerXml.ToString()
    14. Dim test2 As String = document.ReadInnerXml.ToString()
    15. Dim test As String = test2
    16. array(n) = xmlMyname.Text
    17. n = n + 1
    18. End If
    19. End If
    20.  
    21.  
    22. End While
    23.  
    24.  
    25. Else
    26. MessageBox.Show("The filename you selected was not found.")
    27. End If
    28. MsgBox("Warum?!?!?")
    29. End Sub


    Wie gebe ich nun diese Datei im Anschluss an die Ausleseroutine wieder frei?

    Danke bereits im Voraus!

    Viele Grüße
    @jvbsl Using, nicht aber Close()
    @Donni Dein Code leicht aufgeräumt mit Using:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim array As New List(Of String)
    3. Dim n As Integer = 1
    4. Dim path = "C:\Temp\test.xml"
    5. If (System.IO.File.Exists(path)) Then
    6. Using document As XmlReader = New XmlTextReader(path)
    7. While (document.Read())
    8. Dim type = document.NodeType
    9. If (type = XmlNodeType.Element) Then
    10. If (document.Name = "Login" & n) Then
    11. n = n + 1
    12. xmlMyname.Visible = True
    13. xmlMyname.Text = document.ReadInnerXml.ToString()
    14. array.Add(xmlMyname.Text)
    15. End If
    16. End If
    17. End While
    18. End Using
    19. Else
    20. MessageBox.Show("The filename you selected was not found.")
    21. End If
    22. End Sub
    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!
    @jvbsl sicherer und besserer Code sowie (unseren) Codierungsrichtlinien.
    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 sicherer vlt. in der Hinsicht, dass man das Close vergessen kann, wenn man das Using verwendet geschieht dies nicht(was man aber auch vergessen kann). Besser, nein. Codierungsrichtlinien von wem? Versuch mal Using über den Methodenscope hinaus zu verwenden. Wird schön mit den Codierungsrichtlinien, weil dann gehts nicht mehr...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Also vielen Danke erst einmal für die Antworten!
    Ich hab inzwischen gemerkt dass ich vergessen habe, den Reader ("document") wieder zu schließen

    document.Close()

    Jetzt funktioniert es! Aber die mit using aufgeräumte Methode sieht schon chic aus, werde mir das auf alle Fälle noch genauer ansehen!

    Danke noch einmal!

    verschachtelte XML

    Hey,

    und noch eine Frage zum auslesen von XML Dateien...
    Hier die besagte beispielhafte, verschachtelte XML:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <!--XML Database.-->
    3. <Data>
    4. <MaxMustermann>
    5. <Login1>11:30:56</Login1>
    6. <Logout1>11:30:58</Logout1>
    7. <Login2>11:31:00</Login2>
    8. <Logout2>11:31:01</Logout2>
    9. </MaxMustermann>
    10. </Data>



    Jetzt hab ich mir bis jetzt folgenden Code zusammengebastelt:

    VB.NET-Quellcode

    1. Dim array(5000) As String
    2. Dim array2(5000) As String
    3. Dim m1 As Integer = 1
    4. If (System.IO.File.Exists("P:\XML\" & Year(Now) & "-" & System.DateTime.Today.Month.ToString("#00") & ".xml")) Then
    5. Dim document As XmlReader = New XmlTextReader("P:\XML\" & Year(Now) & "-" & System.DateTime.Today.Month.ToString("#00") & ".xml")
    6. While (document.Read())
    7. Dim type = document.NodeType
    8. If (type = XmlNodeType.Element) Then
    9. If (document.Name = "Login" & m1) Then
    10. LblUser1TimeToday.Visible = False
    11. LblUser1TimeToday.Text = document.ReadInnerXml.ToString()
    12. Dim test2 As String = document.ReadInnerXml.ToString()
    13. array(m1) = LblUser1TimeToday.Text
    14. m1 = m1 + 1
    15. End If
    16. End If
    17. End While
    18. document.Close()
    19. Else
    20. MessageBox.Show("The filename you selected was not found.")
    21. End If


    So weit funktioniert das ganze schon! Jetzt sollen aber zusätzlich noch weitere Personen hinzugefügt werden, von denen ich jeweils auch die unterschiedlichen Login und Logout Zeiten aus der XML auslesen und später dann auswerten möchte. Wie schaffe ich es jetzt, die verschachtelten Elemente, sprich die unterschiedlichen Personen, zu unterscheiden? Weil mit einer einfachen weiteren If Abfrage komme ich nicht weiter.... gibt es da eine möglichst einfache Art und Weise?

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <!--XML Database.-->
    3. <Data>
    4. <MaxMustermann>
    5. <Login1>11:30:56</Login1>
    6. <Logout1>11:30:58</Logout1>
    7. <Login2>11:31:00</Login2>
    8. <Logout2>11:31:01</Logout2>
    9. </MaxMustermann>
    10. <StephanNichtmustermann>
    11. <Login1>11:30:56</Login1>
    12. <Logout1>11:30:58</Logout1>
    13. <Login2>11:31:00</Login2>
    14. <Logout2>11:31:01</Logout2>
    15. </StephanNichtmustermann>
    16. </Data>



    Viele Grüße

    jvbsl schrieb:

    weil dann gehts nicht mehr...
    Dann greift Richtlinie b, nach der ein solcher Konstrukt verboten ist...
    (Codierungsrichtlinie der Firma)
    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!

    Donni schrieb:

    folgenden Code
    Sieh Dir zunächst mein Beispiel aus dem anderen Thread an.
    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!
    Eigentlich ist eine XML-Datei anders aufgebaut, damit solche Probleme nicht auftauchen.
    Ich würde die Datei so aufbauen:
    Spoiler anzeigen

    XML-Quellcode

    1. <xml>
    2. <User>
    3. <Name>
    4. Max Mustermann
    5. </Name>
    6. <Logs>
    7. <Log>
    8. <Type>
    9. LogIn
    10. </Type>
    11. <Count>
    12. 1
    13. </Count>
    14. <Time>
    15. 2014-08-18 15:00
    16. </Time>
    17. </Log>
    18. <Log>
    19. <Type>
    20. LogOut
    21. </Type>
    22. <Count>
    23. 1
    24. </Count>
    25. <Time>
    26. 2014-08-18 15:30
    27. </Time>
    28. </Log>
    29. <Log>
    30. <Type>
    31. LogIn
    32. </Type>
    33. <Count>
    34. 2
    35. </Count>
    36. <Time>
    37. 2014-08-18 17:00
    38. </Time>
    39. </Log>
    40. <Log>
    41. <Type>
    42. LogOut
    43. </Type>
    44. <Count>
    45. 2
    46. </Count>
    47. <Time>
    48. 2014-08-18 17:30
    49. </Time>
    50. </Log>
    51. </Logs>
    52. </User>
    53. <User>
    54. <Name>
    55. Moni Tor
    56. </Name>
    57. <Logs>
    58. <Log>
    59. <Type>
    60. LogIn
    61. </Type>
    62. <Count>
    63. 1
    64. </Count>
    65. <Time>
    66. 2014-08-16 12:21
    67. </Time>
    68. </Log>
    69. <Log>
    70. <Type>
    71. LogOut
    72. </Type>
    73. <Count>
    74. 1
    75. </Count>
    76. <Time>
    77. 2014-08-16 13:12
    78. </Time>
    79. </Log>
    80. <Log>
    81. <Type>
    82. LogIn
    83. </Type>
    84. <Count>
    85. 2
    86. </Count>
    87. <Time>
    88. 2014-08-17 10:00
    89. </Time>
    90. </Log>
    91. <Log>
    92. <Type>
    93. LogOut
    94. </Type>
    95. <Count>
    96. 2
    97. </Count>
    98. <Time>
    99. 2014-08-17 17:30
    100. </Time>
    101. </Log>
    102. </Logs>
    103. </User>
    104. </xml>

    Dann kannst du das mit Schleifen und Abfragen einfach auslesen.
    Siehe auch de.selfhtml.org/xml/
    @RodFromGermany Dann greift Richtlinie c, dass Richtlinie a humbug ist :P
    Man braucht manche Dinge über den einfachen Methoden-Scope, das ist völlig normal und essentiell für OOP, ansonsten kannste gleich alles in einer Methode strikt abarbeiten...
    Oder du willst mir doch wohl nicht weiß machen, dass man bei euch in der Firma nur Variablen innerhalb von Methoden definieren dürft und keine Klassenattribute erstellen dürft? :D
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    weiß machen
    Wenn Using geht, dann Using.
    Wenn Du ohne Using mit Close arbeitest, kann es zu potenziellen Fehlern kommen, wenn Du die Routine mittendrin verlässt. Solche pozenziellen Fehler werden dadurch sicher verhindert.
    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!
    Eigentlich ist eine XML-Datei anders aufgebaut, damit solche Probleme nicht auftauchen.
    Ich würde die Datei so aufbauen:


    Das Problem ist, dass ich die XMLs nicht erstelle sondern so vorgegeben bekomme.... hat keiner eine schön schnelle Lösung :)? Irgendeine "Node" Methode oder was weiß ich, von der ich noch nichts gehört habe? Ich komme da gerade nicht so wirklich weiter...

    Viele Grüße
    Also mit XmlReadern kommst du natürlich nicht weiter, wenn du XmlDocumente erstellen oder ändern musst.
    Ich kann dir die XDocument - Klasse empfehlen: XDocument
    Die ist zwar auch v.a. aufs Auslesen ausgelegt, aber die damit zusammenhängende XElement-Klasse verfügt über eine SetElementValue-Methode, mit der man untergeordnete Elemente einhängen kann.
    Guck dir diese Dinge auch im ObjectBrowser und auf Msdn an, weil da musste dich reinfuchsen.