none
Dekodierung von "<..>Something</..>" RRS feed

  • Frage

  • Hallo,

    ich lese Eingaben der folgenden Art ein:

    <ST1>Something 1</ST1>

    <ST2>Something 2</ST2>

    Wie sollte ich das am smartesten dekodieren? Eine Verschachtelung wird nicht vorkommen. Also kein richtiges HTML oder XML. Gibt es dafür eine Klasse, die einem die Arbeit abnimmt?

    Wenn jemand wissen will, warum ich das mache: In der Art habe ich Barcodes (Datamatrix) erstellt, die man scannen kann. Anhand der <..> </..> möchte ich bestimmen, um was es sich handelt und dann entsprechende Schritte einleiten.

    mfg

    Mittwoch, 11. April 2012 11:50

Antworten

  • Hi,

    Du könntest dir eine Klasse erstellen, die die gewünschten Eigenschaften abbildet und dann eine Instanz der Klasse über Deserialisierung erstellen lassen.

    Ein Beispiel für so etwas findest Du hier:

      http://www.aspnetzone.de/files/folders/stefanfalz/entry222489.aspx

    Für dich hätte das den Vorteil, dass Du auch gleich die richtigen Datentypen verwenden kannst.

    Wenn die Struktur immer individuell ist, wäre wohl das Lesen per XmlDocument o.ä. das passendste. Ggfs. musst Du noch den entsprechenden Header (<?xml version="1.0"?>) in den String, den Du da liest, einbauen, damit der Inhalt als XML verarbeitbar ist.



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 11. April 2012 12:30
    Moderator
  • Hallo,

    in was liest du die Eingaben ein? Falls es sich um einen String handelt und die Eingaben durch Zeilenvorschub getrennt sind ginge vielleicht folgendes:

    Public Class Form1
      Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim strEingabe_Encoded As String = _
            "<ST1>Something 1</ST1>" & ControlChars.CrLf & _
            "<ST2>Something 2</ST2>" & ControlChars.CrLf & _
            "<ST3>Something 3</ST3>" & ControlChars.CrLf
        Dim lst_Eingabe As Dictionary(Of String, String)

        ' Decodieren.
        lst_Eingabe = Eingabe_Decode(strEingabe_Encoded)

        ' Ausgeben.
        For Each Eingabe As KeyValuePair(Of String, String) In lst_Eingabe
          Debug.Print(Eingabe.Key & ": " & Eingabe.Value)
        Next
        ' Ergebnis im Immediate Window:
        ' ST1: Something 1
        ' ST2: Something 2
        ' ST3: Something 3
      End Sub


      Private Function Eingabe_Decode(ByVal pstrEingabe_Encoded As String) As Dictionary(Of String, String)
        Dim strEingabe_Encoded As String = ""
        Dim lstEingabe_Encoded As List(Of String)
        Dim lstEingabe_Out As New Dictionary(Of String, String)

      ' Typ und Wert einer einzelnen Eingabe.
        Dim strType As String = ""
        Dim strValue As String = ""

        ' Zur Sicherheit letzten CrLf entfernen falls nicht klar ist ob pstrEingabe_Encoded damit endet.
        strEingabe_Encoded = pstrEingabe_Encoded.Trim

        ' Übertragen des Strings in Liste.
        lstEingabe_Encoded = strEingabe_Encoded.Split(CChar(ControlChars.CrLf)).ToList

        ' Decodieren in die Ausgabeliste.
        For Each Str As String In lstEingabe_Encoded
          strType = Str.Substring(0, Str.IndexOf(">") + 1).Replace("</", "").Replace("<", "").Replace(">", "").Trim
          strValue = Str.Replace("</" & strType & ">", "").Replace("<" & strType & ">", "").Trim
          lstEingabe_Out.Add(strType, strValue)
        Next

        Return lstEingabe_out

      End Function
    End Class

      


    Mittwoch, 11. April 2012 13:37
  • Hallo Stefan,

    in der Zwischenzeit habe ich das mal so codiert:

                //Arbeitsschritt <AS>...</AS>
                if (barcode.StartsWith("<AS>") && barcode.EndsWith("</AS>"))
                {
                    zeichenkette = barcode;
                    zeichenkette = zeichenkette.Replace("<AS>", string.Empty);
                    zeichenkette = zeichenkette.Replace("</AS>", string.Empty);
                    arbeitsschritt = zeichenkette;
                }

    Ich könnte jetzt natürlich eine Funktion schreiben:

    private string RemoveTagsFromBarcode(string startTag, string stopTag, string barcode)
    {
         //do the work
        return barcodeWithoutTags;
    }

    So in der Art. Gibt es da keine bereits eingebaute Funktion, die einem die Arbeit abnimmt?

    mfg

    Hallo HessischerBub,

    es gibt da eine sehr kompakte Möglichkeit und zwar das Arbeiten mit extended functions. In diesem Fall arbeitet diese Erweiterung quasi wie ein member der string Klasse. Schau mal. Vielleicht sagt Dir das zu:

    Module Module1
        Sub Main()
            Dim Zeichenkette As String = "<ST1>Something 1</ST1>"
            Console.WriteLine(Zeichenkette.RemoveTagsFromBarcode)
            Console.ReadKey()
        End Sub
        ''' <summary>
        ''' entfernt Einträge mit spitzen Klammern
        ''' </summary>
        <System.Runtime.CompilerServices.Extension()> Friend Function RemoveTagsFromBarcode(ByVal item As String) As String
            Return item.Replace("<ST1>", String.Empty).Replace("</ST1>", String.Empty)
        End Function
    End Module

    Eine extension muss immer in einem Modul programmiert werden.

    Gruss Ellen


    Ich benutze/ I'm using VB2008 & VB2010

    Mittwoch, 11. April 2012 17:52

Alle Antworten

  • Hi,

    Du könntest dir eine Klasse erstellen, die die gewünschten Eigenschaften abbildet und dann eine Instanz der Klasse über Deserialisierung erstellen lassen.

    Ein Beispiel für so etwas findest Du hier:

      http://www.aspnetzone.de/files/folders/stefanfalz/entry222489.aspx

    Für dich hätte das den Vorteil, dass Du auch gleich die richtigen Datentypen verwenden kannst.

    Wenn die Struktur immer individuell ist, wäre wohl das Lesen per XmlDocument o.ä. das passendste. Ggfs. musst Du noch den entsprechenden Header (<?xml version="1.0"?>) in den String, den Du da liest, einbauen, damit der Inhalt als XML verarbeitbar ist.



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 11. April 2012 12:30
    Moderator
  • Hallo Stefan,

    in der Zwischenzeit habe ich das mal so codiert:

                //Arbeitsschritt <AS>...</AS>
                if (barcode.StartsWith("<AS>") && barcode.EndsWith("</AS>"))
                {
                    zeichenkette = barcode;
                    zeichenkette = zeichenkette.Replace("<AS>", string.Empty);
                    zeichenkette = zeichenkette.Replace("</AS>", string.Empty);
                    arbeitsschritt = zeichenkette;
                }

    Ich könnte jetzt natürlich eine Funktion schreiben:

    private string RemoveTagsFromBarcode(string startTag, string stopTag, string barcode)
    {
         //do the work
        return barcodeWithoutTags;
    }

    So in der Art. Gibt es da keine bereits eingebaute Funktion, die einem die Arbeit abnimmt?

    mfg

    Mittwoch, 11. April 2012 12:54
  • Hi,

    ehrlich gesagt verstehe ich den Zusammenhang zwischen deinem ersten und deinem zweiten Posting nicht. Was hat das eine mit dem anderen zu tun? Hast Du mein Posting gelesen? Falls nicht, warum nicht?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 11. April 2012 13:23
    Moderator
  • Hallo,

    in was liest du die Eingaben ein? Falls es sich um einen String handelt und die Eingaben durch Zeilenvorschub getrennt sind ginge vielleicht folgendes:

    Public Class Form1
      Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim strEingabe_Encoded As String = _
            "<ST1>Something 1</ST1>" & ControlChars.CrLf & _
            "<ST2>Something 2</ST2>" & ControlChars.CrLf & _
            "<ST3>Something 3</ST3>" & ControlChars.CrLf
        Dim lst_Eingabe As Dictionary(Of String, String)

        ' Decodieren.
        lst_Eingabe = Eingabe_Decode(strEingabe_Encoded)

        ' Ausgeben.
        For Each Eingabe As KeyValuePair(Of String, String) In lst_Eingabe
          Debug.Print(Eingabe.Key & ": " & Eingabe.Value)
        Next
        ' Ergebnis im Immediate Window:
        ' ST1: Something 1
        ' ST2: Something 2
        ' ST3: Something 3
      End Sub


      Private Function Eingabe_Decode(ByVal pstrEingabe_Encoded As String) As Dictionary(Of String, String)
        Dim strEingabe_Encoded As String = ""
        Dim lstEingabe_Encoded As List(Of String)
        Dim lstEingabe_Out As New Dictionary(Of String, String)

      ' Typ und Wert einer einzelnen Eingabe.
        Dim strType As String = ""
        Dim strValue As String = ""

        ' Zur Sicherheit letzten CrLf entfernen falls nicht klar ist ob pstrEingabe_Encoded damit endet.
        strEingabe_Encoded = pstrEingabe_Encoded.Trim

        ' Übertragen des Strings in Liste.
        lstEingabe_Encoded = strEingabe_Encoded.Split(CChar(ControlChars.CrLf)).ToList

        ' Decodieren in die Ausgabeliste.
        For Each Str As String In lstEingabe_Encoded
          strType = Str.Substring(0, Str.IndexOf(">") + 1).Replace("</", "").Replace("<", "").Replace(">", "").Trim
          strValue = Str.Replace("</" & strType & ">", "").Replace("<" & strType & ">", "").Trim
          lstEingabe_Out.Add(strType, strValue)
        Next

        Return lstEingabe_out

      End Function
    End Class

      


    Mittwoch, 11. April 2012 13:37
  • Hallo Stefan,

    in der Zwischenzeit habe ich das mal so codiert:

                //Arbeitsschritt <AS>...</AS>
                if (barcode.StartsWith("<AS>") && barcode.EndsWith("</AS>"))
                {
                    zeichenkette = barcode;
                    zeichenkette = zeichenkette.Replace("<AS>", string.Empty);
                    zeichenkette = zeichenkette.Replace("</AS>", string.Empty);
                    arbeitsschritt = zeichenkette;
                }

    Ich könnte jetzt natürlich eine Funktion schreiben:

    private string RemoveTagsFromBarcode(string startTag, string stopTag, string barcode)
    {
         //do the work
        return barcodeWithoutTags;
    }

    So in der Art. Gibt es da keine bereits eingebaute Funktion, die einem die Arbeit abnimmt?

    mfg

    Hallo HessischerBub,

    es gibt da eine sehr kompakte Möglichkeit und zwar das Arbeiten mit extended functions. In diesem Fall arbeitet diese Erweiterung quasi wie ein member der string Klasse. Schau mal. Vielleicht sagt Dir das zu:

    Module Module1
        Sub Main()
            Dim Zeichenkette As String = "<ST1>Something 1</ST1>"
            Console.WriteLine(Zeichenkette.RemoveTagsFromBarcode)
            Console.ReadKey()
        End Sub
        ''' <summary>
        ''' entfernt Einträge mit spitzen Klammern
        ''' </summary>
        <System.Runtime.CompilerServices.Extension()> Friend Function RemoveTagsFromBarcode(ByVal item As String) As String
            Return item.Replace("<ST1>", String.Empty).Replace("</ST1>", String.Empty)
        End Function
    End Module

    Eine extension muss immer in einem Modul programmiert werden.

    Gruss Ellen


    Ich benutze/ I'm using VB2008 & VB2010

    Mittwoch, 11. April 2012 17:52
  • Hallo HessischerBub,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 19. April 2012 12:06
    Moderator