Suche und Ersetzen in einer XML-Datei in nachfolgender Zeile

  • VB.NET

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

    Suche und Ersetzen in einer XML-Datei in nachfolgender Zeile

    Moin!

    diesmal habe ich eine ganz spezielle Frage, die ich vermutlich so gar nicht gelöst bekomme.

    Bei uns gibt es Konfigurationsdateien im XML-Format:

    ...
    </rdf:Description>
    <rdf:Description rdf:about="EBL_KANAL:WW_MANHOLE2">
    <ns0:LayerDefinitionResourceStream xmlns:ns0="http://www.autodesk.com/gis/resource/definitions/" xml:lang="en" rdf:parseType="Literal">
    <LayerDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="LayerDefinition-2.4.0.xsd" version="2.4.0">
    <VectorLayerDefinition>
    <ResourceId>fsd://Topobase_2</ResourceId>
    <FeatureName>EBL_KANAL:WW_MANHOLE</FeatureName>
    <FeatureNameType>FeatureClass</FeatureNameType>
    <Geometry>GEOM</Geometry>
    <VectorScaleRange>
    <CompositeTypeStyle>
    <CompositeRule>
    <LegendLabel>Ein und Auslauf Graben</LegendLabel>
    <Filter>ID_EBL_HYDRAULIK = 6 AND ID_SITE_FUNCTION in (7,11)</Filter>
    <CompositeSymbolization>
    <SymbolInstance>
    <SimpleSymbolDefinition>
    <Name>Quadrat</Name>
    <Description>Standard-Punktsymbol</Description>
    <Graphics>
    <Path>
    <Geometry>M -1.0,-1.0 L 1.0,-1.0 L 1.0,1.0 L -1.0,1.0 L -1.0,-1.0</Geometry>
    <ScaleX>%StyleEditorGenerated_ScaleX_0%</ScaleX>
    <ScaleY>%StyleEditorGenerated_ScaleY_0%</ScaleY>
    <FillColor>%FILLCOLOR%</FillColor>
    <LineColor>%LINECOLOR%</LineColor>
    <LineWeight>%LINEWEIGHT%</LineWeight>
    <LineCap>%StyleEditorGenerated_LineCap_0%</LineCap>
    <LineJoin>%StyleEditorGenerated_LineJoin_0%</LineJoin>
    ...
    <Override>
    <SymbolName>Quadrat</SymbolName>
    <ParameterIdentifier>FILLCOLOR</ParameterIdentifier>
    <ParameterValue>0xffff0000</ParameterValue>
    </Override>


    Wiederkehrend gibt es Blöcke mit FILLCOLOR und LINECOLOR

    <ParameterIdentifier>FILLCOLOR</ParameterIdentifier>


    oder

    <ParameterIdentifier>LINECOLOR</ParameterIdentifier>


    zu denen es in der nächsten Zeile ein Wert gibt

    <ParameterValue>0xff000000</ParameterValue>


    Jetzt wollen wir eine Kopie davon erstellen und in dieser sollen Farbwerte gegen andere ausgetauscht werden.

    Es müßte nun eine Funktion geben die nacheinander die Zeilen durchgeht. Wird eine Zeile mit ParameterIdentifier gefunden, dann weiß das Programm das in der nächsten Zeile eine Farbe definiert ist.

    Diese wird nun ausgelesen und in einer einfachen Tabelle nachgesehen wie der neue Wert lautet. Wurde dieser ermittelt, dann wird der neue Wertü übernommen und weiter geht es in der nächsten Zeile.

    ....

    Mir ist bekannt, dass es gar nicht so einfach sein wird und derzeit überschreitet diese Aufgabenstellung noch unseren .net-Horizont.

    Kann uns dennoch einer weiterhelfen ?

    Gruß Jan

    jan99 schrieb:

    Es müßte nun eine Funktion geben die nacheinander die Zeilen durchgeht. Wird eine Zeile mit ParameterIdentifier gefunden, dann weiß das Programm das in der nächsten Zeile eine Farbe definiert ist.
    Schau dir mal System.IO.File.ReadAllLines(), String.Contains() und String.Substring() an.

    jan99 schrieb:

    Diese wird nun ausgelesen und in einer einfachen Tabelle nachgesehen wie der neue Wert lautet
    Diese Tabelle liegt in welchem Format vor?

    jan99 schrieb:

    Wurde dieser ermittelt, dann wird der neue Wertü übernommen und weiter geht es in der nächsten Zeile.
    Hier hantierst du nun mit String.Remove() und String.Insert() bzw. String.Replace() und schreibst, wenn alle Zeilen durch sind, per System.IO.File.WriteAllLines alles wieder zurück.
    hier könnte regex gut willkommen sein. direkt nach <ParameterValue>0xff000000</ParameterValue> suchen nicht eine zeile davor oder danach.


    VB.NET-Quellcode

    1. Dim regexpattern As New Regex("<ParameterValue>(.*)</ParameterValue>")
    2. For Each item As Match In regexpattern.Matches(RichTextBox1.Text)
    3. MessageBox.Show(item.Groups(1).ToString)
    4. Next

    Hier könnte meine Signatur stehen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mox“ ()

    @jan99 Wie oft muss das geändert werden?
    ==> Je öfter, um so mehr Aufwand wäre angemessen.
    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!
    Moin !

    erst einmal Danke für Eure bisherigen Hinweise.

    @EaranMaleasi: das Format ist noch nicht definiert.

    @RodFromGermany
    @jan99 Wie oft muss das geändert werden?

    ==> Je öfter, um so mehr Aufwand wäre angemessen.


    wiederkehrend!

    @mox: regex - ist nicht so geeignet aus logischen Gründen, wenn man das über die gesamte Datei "laufen" lassen will.
    Stichwort:
    tausche alle roten->gelb
    tausche alle geben->blau
    -> huch, jetzt sind auch alle roten blau!

    Gruß Jan
    Moin!

    ich habe mir das angesehen und das mit dem XDocument macht für mich den sinnigsten Eindruck. XML aus progammiertechnischer Sicht erschließt sich mir erst so langsam und daher die Frage, ob mir einer von Euch ein Beispiel für

    mittels passendem XPath-Ausdruck das/die richtige(n) XElement(e) selectieren und ändern


    geben kann - oder einen passenden Link?

    Gruß Jan