XML - ersten und letzten Knoten behalten, Rest überspringen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von floxnet.

    XML - ersten und letzten Knoten behalten, Rest überspringen

    Hallo Forum,

    letztens hatte ich erst das Thema mit der LinkedList über verschiedene Klassen. Das wäre erstmal abgehakt und erledigt.
    Nun stehe ich aber vor dem nächsten Problem und weiss keinen Rat.

    Ich muss in der Arbeit eine XML einlesen. Die XML sieht etwa so aus:

    XML-Quellcode

    1. <info section-type="register_b" section="1" page-number="11"/>
    2. <info section-type="register_b" section="2" page-number="25" media-type="yellow"/>
    3. <info page-number="26" media-type="yellow"/>
    4. <info page-number="27" media-type="yellow"/>
    5. <info page-number="28" media-type="yellow"/>
    6. <info page-number="29" media-type="yellow"/>
    7. <info page-number="30" media-type="yellow"/>
    8. <info section-type="register_b" section="3" page-number="68"/>
    9. <info section-type="register_b" section="4" page-number="81"/>


    Daraus berechne ich, über page-number, die erste und die letzte Seite eines Dokuments.
    Blöderweise steht bei media-type hinterher [erste Seite 26] und [letzte Seite 26]. Statt 30.

    Ich muss also einen Weg finden die Seiten 27 - 29 nicht zu erfassen - aber hier hänge ich fest.


    Aktuell nutze ich folgenden Code, um die XML auszulesen:

    VB.NET-Quellcode

    1. Dim sectioncounter As Integer = 0
    2. Dim m_myXMLFile As Xml.XmlReader = New Xml.XmlTextReader("...")
    3. Do While m_myXMLFile.Read
    4. Select Case m_myXMLFile.NodeType
    5. Case Xml.XmlNodeType.Element
    6. If m_myXMLFile.Name = "info" Then
    7. If m_myXMLFile.AttributeCount > 0 Then
    8. While m_myXMLFile.MoveToNextAttribute
    9. If m_myXMLFile.Name = "page-number" Then
    10. Dim mySection As New CSection
    11. Dim fSkipPageCalc As Boolean = False
    12. sectioncounter += 1
    13. 'EIGENSCHAFTEN DER SECTION
    14. '---------------------------------------------------------------------
    15. If CDbl(m_myXMLFile.GetAttribute("page-number")) > 1 And m_XMLSections.Count = 0 Then
    16. ' Wenn die aktuelle page-number größer 1 ist und gleichzeitig kein Element in m_XMLSections enthalten ist, sind wir im ersten Element der XML-Datei
    17. ' und es liegt eine unbenannte Section vor der ersten Section
    18. ' Erzeuge an dieser Stelle eine unbenannte Section in der Aufzählung m_XMLSections
    19. fSkipPageCalc = True
    20. Dim myEmptySection As New CSection
    21. myEmptySection.FirstPage = 1
    22. myEmptySection.LastPage = CInt(CDbl(m_myXMLFile.GetAttribute("page-number")) - 1)
    23. myEmptySection.Count = CInt(CDbl(m_myXMLFile.GetAttribute("page-number")) - 1)
    24. m_XMLSections.AddLast(myEmptySection) 'Füge die leere Section in die Sections-Aufzählung hinzu
    25. End If
    26. 'Wir sind entweder im ersten Section-Element oder haben keine leere Section vor dem ersten Element
    27. 'FirstPage und LastPage berechnen
    28. mySection.FirstPage = CInt(m_myXMLFile.GetAttribute("page-number"))
    29. mySection.LastPage = 0 'Wir kennen die nächste Section noch nicht, deshalb vorläufig LastPage = 0 vergben
    30. mySection.Count = 0 'Wir kennen die Seitenzahlenn noch nicht
    31. mySection.MediaType = m_myXMLFile.GetAttribute("media-type")
    32. mySection.Section = m_myXMLFile.GetAttribute("section")
    33. mySection.SectionSheetOrg = CInt(m_myXMLFile.GetAttribute("page-number"))
    34. mySection.SectionType = m_myXMLFile.GetAttribute("section-type")
    35. If fSkipPageCalc = False Then
    36. 'Wir haben in der vorherigen Schleife bereits eine Section in die Sections-Auflistung hinzugefügt
    37. 'Aus dieser Section können wir nun die LastPage und den Count berechnen
    38. Dim PrevSection As CSection = New CSection
    39. Try
    40. PrevSection = m_XMLSections.Last.Value
    41. PrevSection.LastPage = mySection.FirstPage - 1
    42. PrevSection.Count = mySection.FirstPage - PrevSection.FirstPage
    43. Catch ex As Exception
    44. End Try
    45. End If
    46. mySection.SectionCounter = sectioncounter - 1
    47. m_XMLSections.AddLast(mySection)
    48. End If
    49. End While
    50. End If
    51. End If
    52. End Select
    53. Loop



    Kann mir hier jemand helfen nur den ersten und letzten media-type zu lesen?
    Oder alternativ, aber das glaube ich ist komplexer, die LinkedList zu bearbeiten.

    Danke vorab und viele Grüße,
    Floxnet
    @floxnet Bist Du sicher, dass Du mit VB6 programmierst?
    Falls es doch VB.NET ist, ändere mal das Label dieses Threads.
    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!
    @floxnet Jetzt stimmt es, hat vielleicht ein Moderator korrigiert. ;)
    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!
    ich habe nur den relevanten Ausschnitt gepostet.

    achso
    so kannst du den ersten bzw. letzten wert ermitteln

    VB.NET-Quellcode

    1. Dim xFirst As XElement = XElement.Load("E:\XMLTest.xml")
    2. Dim getFirst = xFirst.Descendants("Vorname").ElementAt(0).Value
    3. Debug.WriteLine(getFirst)
    4. Dim xLast As XElement = XElement.Load("D:\XMLTest.xml")
    5. Dim getAll = xLast.Descendants("Kunden").Reverse().Take(1)
    6. For Each getLast In getAll
    7. Debug.WriteLine(getLast.Element("Vorname").Value)
    8. Next getLast

    @Kasi,

    ich hab's getestet. Zuerst wollte ich schreiben "sorry, aber die erste Seite funktioniert einfach nicht".
    Aber... Funktioniert doch. Man muss nur einen anderen Weg einschlagen.

    Das "Reverse" sorgt ja dafür, dass die Werte in umgekehrter Reihenfolge entnommen werden.
    Ich hab einfach zwei Variablen (FirstPage, LastPage) angelegt und lasse die Iteration immer in zwei Try - Catch Funktionen laufen.

    Ist zuerst die letzte Seite gefunden worden, wird ein boolscher Wert auf True gesetzt und der Suchlauf nach der letzten Seite abgebrochen.
    Das gleiche dann mit der ersten Seite, nur dass hier solange die Variable "FirstPage" gefüllt wird, bis beim letzten Suchlauf das Attribut "media-type" mit Wert "yellow" nicht mehr gefunden wird.

    Das mag zwar nicht elegant sein, aber funktioniert ziemlich robust. :)

    Danke für Deinen Input!