XML - Ampersand (&) in setXMLNodeText

Für allgemeine Fragen zur Programmierung mit PureBasic.
ThorKonnat
Beiträge: 4
Registriert: 30.03.2022 19:03

XML - Ampersand (&) in setXMLNodeText

Beitrag von ThorKonnat »

Guten Tag,
ich versuche, aus Purebasic heraus eine spreadsheetML Datei für Microsot Excel zu erzeugen.
Um einen Text 2-zeilig in eine Zelle zu schreiben, muss der Text mit "
" getrennt werden.

Beispiel:
<Data ss:Type="String">Text Zeile1&#10;Text Zeile2</Data>
Ein normaler Zeilenumbruch wird von EXCEL durch Leerzeichen ersetzt.

Nun meine Frage: Wie bekomme ich es hin, dass setXMLNodeText das & Zeichen nicht durch ein &amp; interpretiert?

Alle meine Versuche, das & zu maskieren erzeugen immer wieder "&amp;#10;"

Vielen Dank
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: XML - Ampersand (&) in setXMLNodeText

Beitrag von TroaX »

Nur jetzt ins blaue geraten. Aber verwendest du für das XML auch Unicode bzw. UTF8 als Kodierung? Ich bin bei Markups eher gewohnt, das nur umgewandelt wird, wenn die Anwendung einen begrenzten Zeichensatz erwartet. Früher hat man das & in HTML gegen die Entität &amp; ausgetauscht. Aber seit es in HTML üblich geworden ist, den Zeichensatz anzugeben, benötigt man die aller meisten Entitäten nicht mehr bzw. werden nur noch zum entschärfen von Inlinecodes (z.B. gegen Cross-Site-Scripting) verwendet.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: XML - Ampersand (&) in setXMLNodeText

Beitrag von STARGÅTE »

Hast du es mal mit #CRLF$ probiert?

Code: Alles auswählen

SetXMLNodeText(*Node, "Text Zeile1"+#CRLF$+"Text Zeile2")
Das Sonderzeichen umgewandelt werden ist glaube ich nicht zu verhindern.
Damit wird in jedem Fall immer ein Valider XML Code erzeugt.
Soll heißen, der Text darf nicht den XML-Tree zerstören.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
ThorKonnat
Beiträge: 4
Registriert: 30.03.2022 19:03

Re: XML - Ampersand (&) in setXMLNodeText

Beitrag von ThorKonnat »

@TroaX: ja, ich verwende die XML Standardcodierung UTF8.
Wenn ich "&#10;" eingebe, bekomme ich "&amp;#10;"
Wenn ich &amp;#10;" eingebe, bekomme ich "&amp;amp;#10;" Das & wird sofort durch &amp; ersetzt.

@STARGÅTE : Sowohl #LF$ als auch #CRLF$ als auch \n erzeugen wunderschöne Zeilenumbrüche in der XML Datei.
Leider ersetzt EXCEL diese duch Leerzeichen.
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: Intel Core i3-4170 CPU 3,70 GHz
8,00 GB Arbeitsspeicher
WIN 10 Pro 64 Bit Betriebssystem
Wohnort: Bremen

Re: XML - Ampersand (&) in setXMLNodeText

Beitrag von Pelagio »

Guten Morgen,

es ist notwendig die Zelle auf Textumbruch zu formatieren (Zelle formatieren|Ausrichtung|Textumbruch).
Beispiel ' ="Text1" & ZEICHEN(10) & "Text2" '
Wird Textumbruch nicht gekennzeichnet: Text1Text2
Bei Kennzeichnung vom Textumbuch:
Text1
Text2
Im Augenblick bin ich noch etwas zu müd um einen entsprechenden Code zu posten aber ich hoffe, glaube
das meine Info weiterhelfen wird, kann.
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.10 LTS]. :allright:
ThorKonnat
Beiträge: 4
Registriert: 30.03.2022 19:03

Re: XML - Ampersand (&) in setXMLNodeText

Beitrag von ThorKonnat »

Hallo Pellagio,

Du bist jetzt auf der EXCEL Seite?
In der spreadsheetML Datei sind die EXCEL Felder über <styles> definiert:

<Style ss:ID="S1" ss:Name="Default">
<Alignment ss:Vertical="Center" ss:WrapText="1"/>
<Font ss:FontName="Calibri" ss:Size="10" ss:Color="#000000"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
ss:WrapText="1" schaltet den Zeilenumbruch ein.

Das ist allerdings der automatische Zeilenumbruch, wenn der Text zu lang ist.
Ich möchte den Zellentext an einer von mir definierten Stelle umbrechen, als wenn ich in EXCEL ALT-ENTER drücke.
Dieser Umbruch wird in der spreadsheetML Datei mit "&#10;" erzeugt.

Ich bin das Problem jetzt umgangen, indem ich eine bestimmte Zeichenfolge "\\" in die XML einfüge, die XML dann in ein Editorfenster lade und dort gegen "&#10;" tausche. So habe ich auch gleich eine Kontrollmöglichkeit.
Dann speichere ich den Inhalt mit CreateFile /WriteString / CloseFile und schon macht EXCEL, was ich will.
<Cell ss:MergeAcross="1" ss:StyleID="S1">
<Data ss:Type="String">Text1&#10;Text2</Data>
</Cell>

Vielen Dank für Eure Unterstützung!
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: XML - Ampersand (&) in setXMLNodeText

Beitrag von helpy »

@ThorKonat: Es gibt eine Lösung. Du musst CDATA verwenden.
Hier ein Code-Ausschnitt:

Code: Alles auswählen

 SetXMLNodeText(nData, "Das ist eine Zellemit Zeilenumbruch.")
 nCDATA = CreateXMLNode(nData, "#cdata", #Null, #PB_XML_CData)
 SetXMLNodeText(nCDATA, #LF$)
 SetXMLNodeOffset(nCDATA, 18)
Windows 10
PB Last Final / (Sometimes testing Beta versions)
ThorKonnat
Beiträge: 4
Registriert: 30.03.2022 19:03

Re: XML - Ampersand (&) in setXMLNodeText

Beitrag von ThorKonnat »

Hallo helpy,

leider funktioniet CData als Nodetyp nicht, da ein solcher Node keine Attribute haben darf. Es kommt eine Fehlermeldung...
EXCEL erwartet aber dasAtribut ss:Type.

<Data ss:Type="String">Text Zeile1&#10;Text Zeile2</Data>

Grüße
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: XML - Ampersand (&) in setXMLNodeText

Beitrag von helpy »

Ich meinte auch nicht, dass CDATA anstatt Data verwendet wird!
Es funktioniert, wenn Du Data-Knoten mit Attribut ss:Type verwendest und CDATA als Kindknoten einfügst. Innerhalb von CDATA dann nicht das Entity &#10; einfügen sondern chr(10) ...
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: XML - Ampersand (&) in setXMLNodeText

Beitrag von helpy »

Und hier ein Testcode, der eine XML-Datei aus der DataSection lädt, die zwei vorhandenen Zellen füllt mit Text, der jeweils einen Zeilenumbruch enthält:

Code: Alles auswählen

EnableExplicit

Procedure CellSetString(nCell, text.s)
  Protected nData, nCDATA
  nData = CreateXMLNode(nCell, "Data")
  SetXMLAttribute(nData, "ss:Type", "String")
  nCDATA = CreateXMLNode(nData, "#cdata", #Null, #PB_XML_CData)
  SetXMLNodeText(nCDATA, text)
EndProcedure


Define sXML.s, xml, nRoot
Define nRow, nCell
Define cntCell

Restore ExcelXML_START
Read.s sXML
xml = ParseXML(#PB_Any, sXML)

If xml
  If XMLStatus(xml) = #PB_XML_Success
    Debug "XML loaded succesfully: " + Str(xml)
    nRoot = RootXMLNode(xml)
    nRow = XMLNodeFromPath(nRoot, "/Workbook/Worksheet/Table/Row")
    nCell = ChildXMLNode(nRow)
    While nCell
      cntCell + 1
      CellSetString(nCell,
                    "Zelle in Spalte " + Str(cntCell) + "." + 
                    #LF$ + "Zweite Zeile!" )
      nCell = NextXMLNode(nCell)
    Wend
    SaveXML(xml, GetPathPart(ProgramFilename()) + "test.xml")
    FreeXML(xml)
  Else
    Debug XMLError(xml) + " in line " + Str(XMLErrorLine(xml)) + " at position " + Str(XMLErrorPosition(xml))
  EndIf
Else
  Debug "Could not load xml from data section."
EndIf

DataSection
  ExcelXML_START:
  Data.s ~"<?xml version=\"1.0\"?>\r\n" +
        ~"<?mso-application progid=\"Excel.Sheet\"?>\r\n" +
        ~"<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" +
        ~" xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n" +
        ~" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\r\n" +
        ~" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" +
        ~" xmlns:html=\"http://www.w3.org/TR/REC-html40\">\r\n" +
        ~" <Styles>\r\n" +
        ~"  <Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n" +
        ~"   <Alignment ss:Vertical=\"Top\"/>\r\n" +
        ~"   <Font ss:FontName=\"Calibri\" x:Family=\"Swiss\" ss:Size=\"12\" ss:Color=\"#000000\"/>\r\n" +
        ~"  </Style>\r\n" +
        ~"  <Style ss:ID=\"wrapText\">\r\n" +
        ~"   <Alignment ss:Vertical=\"Top\" ss:WrapText=\"1\"/>\r\n" +
        ~"  </Style>\r\n" +
        ~" </Styles>\r\n" +
        ~" <Worksheet ss:Name=\"Tabelle1\">\r\n" +
        ~"  <Table ss:ExpandedColumnCount=\"2\" ss:ExpandedRowCount=\"1\" x:FullColumns=\"1\"\r\n" +
        ~"   x:FullRows=\"1\" ss:DefaultColumnWidth=\"60\" ss:DefaultRowHeight=\"15\">\r\n" +
        ~"   <Column ss:AutoFitWidth=\"0\" ss:Width=\"150\"/>\r\n" +
        ~"   <Column ss:AutoFitWidth=\"0\" ss:Width=\"150\"/>\r\n" +
        ~"   <Row ss:Height=\"32\">\r\n" +
        ~"    <Cell ss:StyleID=\"wrapText\"></Cell>\r\n" +
        ~"    <Cell ss:StyleID=\"wrapText\"></Cell>\r\n" +
        ~"   </Row>\r\n" +
        ~"  </Table>\r\n" +
        ~" </Worksheet>\r\n" +
        ~"</Workbook>"
  ExcelXML_END:
EndDataSection
Wenn ich die XML-Datei text.xml mit Excel (2016) öffne, dann wird der Text an der korrekten Stelle umgebrochen!
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Antworten