Hilfe beim XML-ParsingAlle,
Dies steht im Zusammenhang mit einer anderen Frage im Forum ( https://community.jmp.com/t5/Discussions/Can-JMP-Support-Excel-Formatting-through-JSL/mp/86355#M38495 ). Ich stelle eine kleine Teilmenge einer wirklich großen XML-Datei (XML eines Arbeitsblatts in Excel) bereit. Ich würde gerne ein gutes Beispiel dafür sehen, wie man den XML-Baum durchläuft, um effizient zu einem Zielelement zu gelangen. Kann jemand ein gutes Beispiel dafür liefern, wie man Parse XML oder eine andere Funktion in JSL am besten verwendet, um den Wert hier in den Griff zu bekommen? Und den Wert bearbeiten?
<C r="A1" s="67" t="s">
<V>0</V>
</C>
<WORKSHEET xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" mc="http://schemas.openxmlformats.org/markup-compatibility/2006" ignorable="x14ac" x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
<DIMENSION ref="A1:BB101473"></DIMENSION>
<SHEETVIEWS>
<SHEETVIEW showgridlines="0" tabselected="1" zoomscalenormal="100" workbookviewid="0">
<SELECTION activecell="A13" sqref="A13"></SELECTION>
</SHEETVIEW>
</SHEETVIEWS>
<SHEETFORMATPR defaultrowheight="15" dydescent="0.25"></SHEETFORMATPR>
<COLS>
</COLS>
<SHEETDATA>
<ROW r="1" ht="24">
<C r="A1" s="67" t="s">
<V>0</V>
</C>
<C r="B1" s="67"></C>
<C r="C1" s="67"></C>
<C r="D1" s="67"></C>
<C r="E1" s="67"></C>
<C r="F1" s="67"></C>
<C r="G1" s="67"></C>
<C r="H1" s="67"></C>
<C r="I1" s="67"></C>
<C r="J1" s="67"></C>
<C r="K1" s="67"></C>
<C r="L1" s="67"></C>
<C r="M1" s="67"></C>
<C r="N1" s="10"></C>
<C r="O1" s="4"></C>
<C r="P1" s="4"></C>
<C r="Q1" s="4"></C>
<C r="R1" s="27"></C>
<C r="S1" s="27"></C>
<C r="T1" s="27"></C>
</ROW>
</SHEETDATA>
</WORKSHEET>Ich habe Folgendes versucht und eine leere Tabelle erhalten:
Parse XML(xml,
On Element("sheetData",Start Tag(New Table())),
On Element( "col", End Tag( New Column( XML Attr( "row r = '1' ht ='24'" ), Set Values( Parse( XML Text() ) ) ) ) )
);Betreff: Hilfe beim XML-Parsing@gzmorgan0 ,
Vielen Dank für eine ausführliche Antwort.
Zielsetzung : Nehmen Sie eine große Excel-Arbeitsmappe mit vielen Formatierungen und bearbeiten Sie die Werte im Blatt, ohne die Formatierung zu ändern.
Optionen, die mir bisher begegnet sind:
- Verwenden Sie ein R-Paket (wie XLConnect (zu langsam) oder openxlsx (formatiert durcheinander und ist langsam)).
- Verwenden Sie JSL
- Mit JSL ist die einzige praktikable Option, die mir bisher zum Beibehalten der Formatierung begegnet ist, basierend auf Ians Vorschlag, nämlich auf das XML hinter der Excel-Arbeitsmappe zuzugreifen, was ich versuche.
- Möglicherweise gibt es eine Möglichkeit, XPath Query wie folgt zu verwenden:
XPath Query("\[<C r="J6" s="48"><V>1</V></C>]\","//v/text()");Es gibt den richtigen Wert in der Zelle zurück, allerdings stellt sich dann die Frage, wie man diesen Wert ersetzen kann, ohne eine globale Ersetzung durchzuführen.
- Verwenden Sie das von Ihnen vorgeschlagene VB-Skript mit „Programm ausführen“.
Da der XML-Code hinter sheet1 sehr umfangreich ist (100.000 Zeilen oder mehr), habe ich einen kleinen Ausschnitt als Beispiel genommen, um die Community um Hilfe zu bitten, wie ich die Hierarchie effizient aufschlüsseln kann. Ich hatte gehofft, die gesamte Lösung innerhalb von JSL zu belassen und sie sauber und effizient zu gestalten, aber es sieht so aus, als müsste ich mich auf andere Programme verlassen, wenn es keine anderen Optionen zum Ändern des XML gibt. Glauben Sie, dass es noch andere Optionen gibt, die mir fehlen? Gibt es eine bessere Möglichkeit, dieses Problem zu lösen?
Betreff: Hilfe beim XML-Parsingps für den XML-Ausschnitt, den Sie in Ihrem Beitrag hatten, nur Zelle A1 hatte einen Wert. Es war vom Typ string und Sie mussten seinen Wert aus der Datei abrufen „xl/sharedStrings.xml“
Betreff: Hilfe beim XML-Parsing@uday_guntupalli Aufgrund Ihres früheren Beitrags und dieser E-Mail-Zeichenfolge bin ich mir immer noch nicht sicher, was Sie tun möchten? Excel besitzt sein Format.Ich habe einen einfachen Lesevorgang aus einer XML-bezogenen Datei durchgeführt, in die Datei geschrieben und die ZIP-Datei gespeichert. Als ich sie in Excel geöffnet habe, hieß es, sie sei beschädigt, aber als ich die Option zur Behebung auswählte, enthielt die Excel-Arbeitsmappe meine geänderten Werte.(Vielleicht habe ich in eine Formelzelle geschrieben??).
Versuchen Sie, eine große Excel-Datei als Datenbank zum Lesen und Schreiben zu verwenden? Versuchen Sie, die Formatierung zu ändern?Was ist die spezifische Aufgabe, einschließlich Umfang (Größe, Aufgabe, Aktualisierung, Hinzufügen von Zeilen, Löschen von Zeilen usw.).
Unten finden Sie einen Ausschnitt aus einer XML-Datei in einer dreiseitigen XLSX-Datei, die aus Big Class.jmp, Iris.jmp und Semiconductor Capability.jmp erstellt wurde. Dies ist das erste Blatt.Zu beachten ist die Dimension A1:E41, da die erste Zeile die Spaltennamen enthält. Sobald Sie das Tag sheetData gefunden haben, sind die Daten nach Zeile und Zelle organisiert, sodass es nicht einfach ist, eine Spalte zu ersetzen.Beachten Sie auch, dass die Zellen mit Zeichenfolgen die zusätzliche Codierung t =\!"s\!" haben. Dies bedeutet, dass es sich um eine Zeichenfolge handelt und der Wert eine Zahl ist.Wenn Sie diesen Zeichenfolgenwert benötigen, müssen Sie diesen Zeichenfolgenwert in der Datei „xl/sharedStrings.xml“ nachschlagen. Die Referenznummerierung beginnt mit 0.Für diese einfache 3-Blatt-Excel-Datei gibt es 490 eindeutige Zeichenfolgen, Zeichenfolge 44 ist „F“ und 45 ist „M“ für Geschlecht.
Wenn Sie sich für das Lesen und Schreiben von XML interessieren, finden Sie in JSL Companion 2nd Edition einen Abschnitt sowie mehrere Skripte und Beispiele. Aber für das, was Sie meiner Meinung nach tun wollen, würde ich es nicht mit XML machen.
"xl/worksheets/sheet1.xml"
"
<WORKSHEET xmlns="\!"http://schemas.openxmlformats.org/spreadsheetml/2006/main\!"" r="\!"http://schemas.openxmlformats.org/officeDocument/2006/relationships\!"" mc="\!"http://schemas.openxmlformats.org/markup-compatibility/2006\!"" ignorable="\!"x14ac" xr="" xr2="" xr3="">
<DIMENSION ref="\!"A1:E41\!"/">
<SHEETVIEWS><SHEETVIEW tabselected="\!"1\!"" workbookviewid="\!"0\!"/"></SHEETVIEW>
<SHEETFORMATPR defaultrowheight="\!"14.4\!"" dydescent="\!"0.3\!"/">
<COLS>
</COLS>
<SHEETDATA>
<ROW r="\!"1\!"" spans="\!"1:5\!"" ht="\!"18.600000000000001\!"" dydescent="\!"0.45\!"">
<C r="\!"A1\!"" s="\!"1\!"" t="\!"s\!""><V>0</V></C>
<C r="\!"B1\!"" s="\!"1\!"" t="\!"s\!""><V>1</V></C>
<C r="\!"C1\!"" s="\!"1\!"" t="\!"s\!""><V>2</V></C>
<C r="\!"D1\!"" s="\!"1\!"" t="\!"s\!""><V>3</V></C>
<C r="\!"E1\!"" s="\!"1\!"" t="\!"s\!""><V>4</V></C>
</ROW>
<ROW r="\!"2\!"" spans="\!"1:5\!"" dydescent="\!"0.3\!"">
<C r="\!"A2\!"" t="\!"s\!""><V>5</V></C>
<C r="\!"B2\!""><V>12</V></C>
<C r="\!"C2\!"" t="\!"s\!""><V>44</V></C>
<C r="\!"D2\!""><V>59</V></C>
<C r="\!"E2\!""><V>95</V></C>
</ROW></SHEETDATA></SHEETFORMATPR></SHEETVIEWS></DIMENSION></WORKSHEET>
Betreff: Hilfe beim XML-Parsing
@uday_guntupalli schrieb:
@Craige_Hales ,
Das ist wirklich hilfreich. Können wir versuchen, auf die inhärente XML-Struktur zuzugreifen, die eine klar definierte Struktur hat?
Der Grund, warum ich diese Frage stelle, ist, dass der Pat-Regex-Ansatz zwar schnell und effizient ist, ich aber befürchte, dass er möglicherweise ständige Änderungen am Skript erfordert, um mit selbst kleinsten Änderungen im Quell-Excel Schritt zu halten. Während die Ausrichtung auf Attribute anstelle von Zeichenfolgen möglicherweise robuster ist?
Aktualisieren : Wenn ich mit der Entwicklung meiner Lösung beginne, wird die Lösung umso langsamer, je mehr Pat-Regex-Operationen ich verwende. Es sieht nicht skalierbar aus. Ich habe mindestens 20 Felder, die ich ersetzen muss, sowie eine Zeitreihe von 8760 Werten in 5 Spalten, die ich ersetzen muss. Derzeit dauert JMP bei über 8 Regex-Vorgängen durchschnittlich jeweils 3,25 Sekunden. Können Sie andere skalierbare Alternativen empfehlen? Außerdem erhalte ich am Ende von Pat Regex keine 1.
x = char(10);
Pat Match(
xml, // source
Pat Regex( "\[<C>\s*<V>]\" ) >> prefix + // what comes before goes in prefix
Pat Regex( "[^<]*" ) >> old + // the middle part we care about, probably some digits
Pat Regex( "\[</V>\s*</C>]\" ) >> suffix, // what comes after goes in suffix
prefix || x|| suffix // replace the matched section with this
);
Betreff: Hilfe beim XML-Parsing@Craige_Hales ,
Das ist wirklich hilfreich. Können wir versuchen, auf die inhärente XML-Struktur zuzugreifen, die eine klar definierte Struktur hat?
Der Grund, warum ich diese Frage stelle, ist, dass der Pat-Regex-Ansatz zwar schnell und effizient ist, ich aber befürchte, dass er möglicherweise ständige Änderungen am Skript erfordert, um mit selbst kleinsten Änderungen im Quell-Excel Schritt zu halten. Während die Ausrichtung auf Attribute anstelle von Zeichenfolgen möglicherweise robuster ist?
Betreff: Hilfe beim XML-ParsingWenn nichts anderes das XML aktualisiert, können Sie es mit ein wenig Mustervergleich ganz einfach halten:
Pat Match(
xml, // source
Pat Regex( "\[<C>\s*<V>]\" ) >> prefix + // what comes before goes in prefix
Pat Regex( "[^<]*" ) >> old + // the middle part we care about, probably some digits
Pat Regex( "\[</V>\s*</C>]\" ) >> suffix, // what comes after goes in suffix
prefix || "42" || suffix // replace the matched section with this
);
show(old);
wodurch die 0 durch 42 ersetzt wird. Es zeigt den alten Wert (0). Führen Sie es erneut aus und es wird 42 angezeigt.
Ich habe \s+ und \s* anstelle eines fest codierten Satzes von Leerzeichen verwendet. Das Suffix/Präfix wird aus dem Dokument erfasst, einschließlich der tatsächlichen Leerzeichen des Dokuments, daher sollte die einzige Änderung 0 -> 42 sein. Das mittlere Bit, [^<]*, erfasst eine Folge von null oder mehr Zeichen, die nicht < sind (der Anfang des nächsten Tags).
Testen Sie unbedingt den Rückkehrcode von patmatch(). Wenn es nicht 1 ist, entspricht das XML nicht mehr dem, was das Muster erwartet.