Announcement

Collapse
No announcement yet.

XElement

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XElement

    Guten Morgen,

    beim Durchlaufen der Elemente eines xElements komme ich ins Stolpern. Es gibt eine Exception, und ich weiss nicht, wie ich die abfangen kann.
    Die Schleife startet mit
    Code:
    For Each xe As XElement In element.Elements
    Läuft gut, ausser wenn ein Knoten mit Kommentar (XComment) in der XML steht. Dann fliegt es mir um die Ohren, denn der Compiler kann XComment nicht in XElement casten (for each xe ...).
    Mit Try..Catch bin ich nicht weiter gekommen, da das Ganze in einer rekursiven Funktion läuft und diese dann durcheinander kommt.

    Hier ein bisschen mehr Code. Ich baue aus einer Xml-Datei einen Operator-String zusammen, denn ich (dank sei Ralf Jansen!) dann auswerte.
    Code:
    Private Function AllElementsRecursiv(ByVal element As XElement, depth As Int32) As String
            Static opString As String
            Static operand As New String(CType("And", Char()))
            Static liste As List(Of String)
    
            If opString Is Nothing Then opString = ""
            If liste Is Nothing Then
                liste = New List(Of String)
                liste.Add(operand)
            End If
    
            For Each xe As XElement In element.Elements
                If xe.Name.LocalName.StartsWith("and") Or xe.Name.LocalName.StartsWith("or") Then
                    operand = xe.Name.LocalName
                    opString += " ("
                    liste.Add(operand)
                Else
                    opString += " " & xe.Name.LocalName & " "   'nur zum Testen, hier wird xe ausgewertet und ergibt "True" oder "False"
                    If Not xe Is element.LastNode Then
                        opString += operand
                    End If
                End If
                If xe.Nodes.Count > 0 Then
                    AllElementsRecursiv(xe, depth + 1)
                    opString += ") "
                    If Not xe Is element.LastNode Then
                        opString += liste(depth)
                    End If
                End If
            Next
    
            Return opString        'ergibt dann z.B. "True And(((True And True) Or False) And True)"
    Kann mir jemand helfen? Danke.

  • #2
    Durchlaufe das als XNode. Sowohl XComment als auch XElement sind von dieser Klasse abgeleitet. Du kannst dann mit TypeOf prüfen, ob der akutelle Node eben vom Typ Comment oder Element ist, und dann entsprechend weiter bearbeiten
    Christian

    Comment


    • #3
      Danke!
      Stehe trotzdem auf dem Schlauch, weil XNode keine Eigenschaft "Name" hat. Wie komme ich an den Namen?

      Comment


      • #4
        Wenn de Node vom Type XElement ist auf XElement casten
        Christian

        Comment


        • #5
          'tschuldigung, dass ich mich so dumm angestellt habe.
          Hab ne Lösung (?):
          Code:
                  For Each xn As XNode In element.Elements
                      If xn.NodeType = XmlNodeType.Element Then
                          Dim xe As XElement = DirectCast(xn, XElement)
          XNode lässt sich in XElement casten.
          Mach ich das richtig so?

          Comment


          • #6
            Wenns geht und das gewünschte Ergebnis bringt....
            Christian

            Comment

            Working...
            X