Editor (oder Plugin), der beim Bearbeiten von XML den aktuellen XPath mit Tag-Attributen anzeigt

Im Beispiel-XML-Entwurf:

<unit name="Alpha">
    <unit name="One">
         █1
    </unit>
    <unit name="Two">
         █2
    </unit>
</unit>

Ich möchte irgendwie finden, wie man XPath enthält

  • unit@name="Alpha"/unit@name="One"wenn sich das Caretzeichen an Position █1 befindet

oder

  • unit@name="Alpha"/unit@name="Two"wenn sich das Caretzeichen an Position █2 befindet

damit ich große XML-Dateien bearbeiten kann, ohne ihre Gliederung zu reduzieren und Namensattribute selbst zu lesen.

Idealerweise würde ich gerne einen Weg finden, einen solchen XPath in einem freien Texteditor in Windows zu erhalten.

Es ist eine gute Aufgabe für das CudaText-Plugin, wenn Sie Python kennen. Das Plugin "CudaExt" hat bereits einen Befehl, der den aktuellen Codebaumpfad in der Statusleiste anzeigt: "Show current path in statusbar". Sie können eine neue erstellen.
@RProgram – hm, es geht weniger um Python als vielmehr darum, die notwendigen Editor-APIs und -Bibliotheken zu lernen. Im Moment brauche ich etwas Fertiges,
Ich werde dieses Plugin erstellen, wenn Sie ein Basis-Python-Modul erstellen, das die XPath-Zeichenfolge aus Textzeilen und der Cursorposition findet.
@RProgram – danke, wenn ich so weit komme, wird es relativ wenig Aufwand sein, den Rest hinzuzufügen :) Das, was Sie erwähnen, ist bereits im Notepad++ XML Tools-Plugin (in C++) und im VS Code XML Tools-Plugin erledigt (höchstwahrscheinlich in C#, aber ich bin mir jetzt nicht sicher, ob sein Code öffentlich ist). Ich meine, sie zeigen bereits den XPath an, aber als Elemente ohne Attributwerte. Ich würde es vorziehen, diese Notepad ++ - Lösung zu ändern. Kommst du auch mit C++ zurecht?
Nun, ich brauche nur Python-Code, da CudaText plattformübergreifend ist.

Antworten (2)

Nach keiner Antwort habe ich ein einfaches Python-Skript entwickelt, das mit dem Python-Skript- Plugin im Notepad ++ - Editor verwendet werden soll. Es kann an eine Tastenkombination oder ein Symbol in der Symbolleiste* angehängt werden, um alle übergeordneten XML-Tags des Tags anzuzeigen, das sich an der Cursorposition befindet.

import re

matches = []
def match_found(m):
 matches.append(m.group(0))

editor.research('<[A-Za-z0-9_]+[^/>]*>|</[A-Za-z0-9_]+>', match_found, 0, 0, editor.getCurrentPos())
path = []
for m in matches:
 if m[:2] == "</":
  path.pop()
 elif m[-2:] != "/>":
  path.append(m)

msg = ""
for m in path:
 msg += m + "\n"

notepad.messageBox(msg, "Parents of current tag", 0)

*) Aufgrund eines aktuellen internen Problems des Plugins funktioniert das Skript nur, wenn es an das zweite oder höhere Symbolleistensymbol angehängt ist, das von diesem Plugin hinzugefügt wurde. Das erste Symbol hat Probleme, hängen Sie etwas daran an und klicken Sie nicht darauf. Effektiver ist es, einfach eine Tastenkombination über Settings > Shortcut Mapper > Plugin Commands zu binden .

Ich werde versuchen, dieses Skript anzupassen, um den CudaText-Befehl im Plugin CudaExt zu erstellen.
@RProgram – OK :) Bitte beachten Sie nur, dass dies eine schnelle und schmutzige Lösung ist, die für meine Bedürfnisse ausreicht. Es verarbeitet beispielsweise keine XML-Kommentare. Eine geeignete Lösung erfordert möglicherweise eine regelmäßige XML-Analyse mithilfe der XML-Bibliothek und verwendet dann möglicherweise das erstellte Dokumentobjektmodell, um den Pfad zu bestimmen.

Der CudaText- Editor (kostenlos) hat das Plugin CudaExt (in Plugins/AddonManager installieren), es gibt den Befehl "Code Tree: Show current path in statusbar".

Für die XML-Datei zeigt der Befehl den Pfad im XML-Baum an, wie auf dem Screenshot (gelber Balken unten). Einziger Hinweis: Der Cursor muss sich innerhalb von befinden <tag ... >, nicht dahinter.

CudaText

Basierend auf dem Screenshot befürchte ich, dass der vom Plugin bereitgestellte Pfad die in der Frage angegebenen Kriterien nicht erfüllt. Elemente im Pfad werden nicht mit ihren Attributen angezeigt. Ein solches Plugin (zeigt Pfad ohne Attribute) ist in vielen Editoren verfügbar, aber für mich ist es nutzlos, denn wenn viele ähnliche übergeordnete Abschnitte existieren (in meinem Beispiel wären das "Alpha", "Beta", ....), Sie wissen nicht, in welchem ​​Sie sich gerade befinden, wenn sie Hunderte von Datensätzen wie "eins", "zwei" enthalten, für die Sie viele Bildschirme nach oben scrollen müssen, um das übergeordnete XML-Tag zu finden.