Server Client - Textfilterproblem

  • VB.NET

Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von Chris2208.

    Server Client - Textfilterproblem

    Hallo,


    bin seit seeeehr langer Zeit wieder mal am Programmieren und stehe vor einem Problem mit Textfilterung!

    Da ich nur sehr selten etwas mit VBA mache benötige ich eure Hilfe bzw. ein fertiges Codeschnipsel.

    Ich bekomme über einen Server eine Nachricht, die dann in eine RichTextBox geschoben wird, die originale Nachricht sieht so aus:

    <name>Test Status</name>
    <address>0000</address>
    <type>9999</type>
    <timestamp>1455871174452</timestamp>
    <flags>0</flags>
    <user>Tester</user>
    </event>


    der rot markierte Text ändert sich bei jeder Meldung und soll dann überbleiben und in eine andere TextBox geschoben werden, in diesem Beispiel also in der ersten Zeile "Test Status"! Im Prinzip benötige ich von der ganzen Meldung nur die erste Zeile mit " <name> .....</name>", besser gesagt nur den Text zwischen drinnen.

    Ich sitze schon Stunden und durchforste das Netz für Lösungen, habe einige gefunden, doch diese funktionieren immer nur bei statischem Text und nicht so wie bei mir mit dynamischen....

    Könntet Ihr mir da helfen, danke!!


    LG Chris

    Chris2208 schrieb:

    die originale Nachricht sieht so aus
    Sähe die originale Nachricht so aus:

    XML-Quellcode

    1. <?xml version="1.0" encoding="Windows-1252"?>
    2. <MyData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    3. <name>Test Status</name>
    4. <address>0000</address>
    5. <type>9999</type>
    6. <timestamp>1455871174452</timestamp>
    7. <flags>0</flags>
    8. <user>Tester</user>
    9. <event />
    10. </MyData>
    könntest Du sie mit diesem Code serialisieren und deserialisieren und hast alle Daten in der Instanz einer Datenklasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Xml.Serialization
    3. Imports System.Text
    4. Public Class Form1
    5. Private XmlFile As String
    6. Private Data As MyData
    7. Public Sub New()
    8. Me.InitializeComponent()
    9. ' Instanz erstellen und befüllen
    10. Me.Data = New MyData()
    11. Me.Data.name = "Test Status"
    12. Me.Data.address = "0000"
    13. Me.Data.type = 9999
    14. Me.Data.timestamp = 1455871174452
    15. Me.Data.flags = 0
    16. Me.Data.user = "Tester"
    17. Me.Data.event = ""
    18. Me.XmlFile = "c:\temp\data.xml"
    19. End Sub
    20. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    21. Me.WriteData(Me.Data, Me.XmlFile)
    22. End Sub
    23. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    24. Me.Data = Me.LoadData(Me.XmlFile)
    25. End Sub
    26. ' in eine Datei schreiben
    27. Public Sub WriteData(data As MyData, file As String)
    28. ' Serialize object to a XML file.
    29. Using sw As New StreamWriter(file, False, Encoding.Default)
    30. Dim x As New XmlSerializer(data.[GetType]())
    31. x.Serialize(sw, data)
    32. End Using
    33. End Sub
    34. ' aus einer Datei lesen
    35. Public Function LoadData(file As String) As MyData
    36. Dim data As New MyData()
    37. Try
    38. ' Deserialize XML file to a new object.
    39. Using sr As New StreamReader(file, Encoding.Default)
    40. Dim x As New XmlSerializer(data.[GetType]())
    41. data = DirectCast(x.Deserialize(sr), MyData)
    42. End Using
    43. Return data
    44. ' nix tun, die Daten-Instanz ist nicht valid
    45. Catch
    46. End Try
    47. Return data
    48. End Function
    49. End Class
    50. Public Class MyData
    51. ' alle vorkommenden Daten
    52. Public Property name() As String
    53. Public Property address() As String
    54. Public Property type() As Integer
    55. Public Property timestamp() As Long
    56. Public Property flags() As Integer
    57. Public Property user() As String
    58. Public Property [event]() As String
    59. Public Sub New()
    60. ' Hier die Daten mit Defaultwerten befüllen oder nicht
    61. Me.name = "Hase"
    62. End Sub
    63. End Class
    Du müsstest nur die Rahmenzeilen drumherumlegen, dies als Text speichern und deserialisieren.
    Feddich.
    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!
    Hallo,

    das ging aber schnell, danke !!

    Die Nachricht wird leider so gesendet bzw. empfangen, wie ich im Beitrag geschrieben habe! Es gibt noch eine Möglichkeit, die Nachricht als .txt abzuspeichern, hier kann ich es beim Server so Einstellen, dass wirklich nur der Text ohne die ganzen "<>/" übergeben wird, nur ist das halt nicht die feine Art und auch nicht gewollt!

    LG Chris

    Chris2208 schrieb:

    so gesendet bzw. empfangen
    Dann machen wir halt einen vollständigen XML-Stream draus und lesen den aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    2. ' das bekommst Du
    3. Dim empfang() = {"<name>Test Status</name>", "<address>0000</address>", "<type>9999</type>", "<timestamp>1455871174452</timestamp>", "<flags>0</flags>", "<user>Tester</user>", "<event/>"}
    4. ' das machen wir draus
    5. Dim xml = New List(Of String)
    6. xml.Add("<?xml version=""1.0"" encoding=""Windows-1252""?>")
    7. xml.Add("<MyData xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">")
    8. xml.AddRange(empfang) ' Deine Daten
    9. xml.Add("</MyData>")
    10. 'IO.File.WriteAllLines("c:\temp\xxxxx.xml", xml.ToArray) ' Test, ob das Format stimmt
    11. ' wie oben, nur halt ein MemoryStream, kein StreamReader
    12. Dim data As New MyData()
    13. Using ms = Me.GenerateStreamFromString(xml)
    14. Dim x As New XmlSerializer(data.GetType())
    15. data = DirectCast(x.Deserialize(ms), MyData)
    16. End Using ' MemoryStream schließen
    17. MessageBox.Show(data.name)
    18. End Sub
    19. ' schreiben der Daten in einen MemoryStream
    20. Public Function GenerateStreamFromString(lst As List(Of String)) As MemoryStream
    21. Dim ms As New MemoryStream()
    22. Dim sw As New StreamWriter(ms, Encoding.Default)
    23. For Each line In lst
    24. sw.Write(line)
    25. Next
    26. sw.Flush()
    27. ms.Position = 0
    28. ' Stream offen lassen
    29. Return ms
    30. End Function

    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!
    Hallo,

    hab den Code eingefügt, bekomme aber bei "MyData", "XmlSerializer", "MemoryStream", und "StreamWriter" einen "nicht deklariert" Fehler!

    Noch ne blöde Frage, es steht im Code folgendes:

    Quellcode

    1. ​Dim empfang() = {"<name>Test Status</name>", "<address>0000</address>", "<type>9999</type>", "<timestamp>1455871174452</timestamp>", "<flags>0</flags>", "<user>Tester</user>", "<event/>"}


    Die Daten wie "Test Status", "0000", "9999", ect. sind KEINE FIXTEXTE, alles was zwischen den <> steht bleibt immer gleich...Hast du das berücksichtigt, da es ja im Code drinnen steht??

    Danke dir!!

    LG Chris

    Chris2208 schrieb:

    sind KEINE FIXTEXTE
    :thumbsup:
    Genau das ist der Plan.
    Füge dies ganz oben in den Code ein:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Xml.Serialization
    3. Imports System.Text
    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!

    Chris2208 schrieb:

    kein Member von...
    :rolleyes:
    Post #2, Code, ganz unten.
    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!

    Chris2208 schrieb:

    Button 2
    Inzwischen haben wir

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Handles Button3.Click
    In dieser Prozedur wird mit Deinen Daten ein XML-Stream generiert, der deserialisiert wird. Danach liegt er asl instanz der Klasse MyData vor, da kannst Du alle Werte auslesen oder nur die eine Zeile.
    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!
    Ahh ja sorry, ich bin das neue Forum noch nicht gewöhnt, die Spoiler sind immer alle zu deswegen übersehe ich immer die Codes :D

    Es funktioniert jetzt alles, werde mal versuchen, ob ich das jetzt auf meine Bedürfnisse umschnitzen kann!

    VIELEN DANK FÜR DEINE HILFE und das du dir Zeit genommen hast!!

    LG Chris
    Hallo,

    ich hätte noch ne Frage,

    Die Daten werden vom "Button 4" fix vorgegeben:

    Quellcode

    1. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    2. ' das bekommst Du
    3. Dim empfang() = {"<name>Test Status</name>", "<address>0000</address>", "<type>9999</type>", "<timestamp>1455871174452</timestamp>", "<flags>0</flags>", "<user>Tester</user>", "<event/>"}



    wie soll ich das jetzt am besten umschreiben wenn die Daten jetzt angenommen von TextBox1 kommen, und zwar mit dynamischem Text zwischen den "><"

    Vereinfacht erklärt:

    einmal kommt <name>Test Status</name>
    dann <name>Einsatz</name>
    oder <name>Meine Wehr</name>
    oder ganz was anderes zwischen den "><" ....

    ist der Code dafür ausgelegt, dass sich der Text ändern kann??

    Danke nochmal!!
    LG Chris

    Chris2208 schrieb:

    einmal kommt
    Wie GANZ GENAU kommt solch Text bei Dir 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!
    Hi,

    Hier nochmal genau:

    Die Nachricht wird so empfangen, bis auf den blauen Text

    <name>Test Status</name>
    <address>0000</address>
    <type>9999</type>
    <timestamp>1455871174452</timestamp>
    <flags>0</flags>
    <user>Tester</user>
    </event>

    Alles was blau ist, ist ein dynamischer Text, der sich mit jeder Nachricht ändert oder ändern kann, alles andere ist statisch, also Fixtext!!

    Chris

    Chris2208 schrieb:

    wird so empfangen
    ja wie denn :?:
    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!

    Chris2208 schrieb:

    Feuerwehr
    ist in diesem Sinne unwichtig.
    Wie kommt diese Textinformation von extern in Dein Programm?
    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!
    Definiere

    Chris2208 schrieb:

    per Netzwerkereignis
    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!
    Die Meldung wird über das Netzwerk gesendet, in diesem Fall mom. über die IP Adresse 127.0.0.1 ( localhost ) auf dem Port 8000 und dann im oben genannten Format im eigenen Programm empfangen! In dem Format ist halt alles notwendige drinnen, und man kann sich das was man braucht herausnehmen.

    Das wird verwendet

    Quellcode

    1. ​Imports System.Net.Sockets, System.Threading, System.IO


    Chris