ToCastrate_XML_NodeText

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

ToCastrate_XML_NodeText

Beitrag von Rudi »

Wer einen XML-Editor zum bearbeiten von XML-Dateien verwendet, der wird sich etwas Speicherplatz sparen wollen und diese Dateien unformatiert abspeichern. Das heißt, dass weder Leerzeichen, noch Umbrüche enthalten sind. So weit, so gut. Aber: Was ich nicht für sinnvoll erachte, ist, dass auch die Leerzeichen innerhalb des Nodetextes abgeschnitten werden:

Code: Alles auswählen

XML = ParseXML(#PB_Any, "<Node>Das ist (war) ein Satz mit Leerzeichen.</Node>")
FormatXML(XML, #PB_XML_CutNewline|#PB_XML_CutSpace|#PB_XML_ReduceNewline|#PB_XML_ReduceSpace)
Debug GetXMLNodeText(MainXMLNode(XML))
Bug oder Feature?
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ToCastrate_XML_NodeText

Beitrag von Kiffi »

ich würde sagen: Feature
PB-Hilfe hat geschrieben:#PB_XML_CutSpace : Removes all spaces
Grüße ... Peter
a²+b²=mc²
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ToCastrate_XML_NodeText

Beitrag von NicTheQuick »

Ich wüsste jetzt auch nicht, wo das erwünscht sein könnte.
Einerseits macht es was sinnvolles, andererseits zerstört es tatsächlich Inhalte.

Code: Alles auswählen

xmlstr.s = ~"<table>\n\t<tr>\n\t\t<td>\n\t\t\tDas ist (war) ein Satz mit Leerzeichen.\n\t\t</td>\n\t</tr>\n</table>"
Debug xmlstr
XML = ParseXML(#PB_Any, xmlstr)
FormatXML(XML, #PB_XML_CutNewline|#PB_XML_ReduceNewline|#PB_XML_ReduceSpace|#PB_XML_CutSpace)
Debug ComposeXML(XML)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ToCastrate_XML_NodeText

Beitrag von Kiffi »

wie wäre es hiermit?

Code: Alles auswählen

xmlstr.s = ~"<table>\n\t<tr>\n\t\t<td>\n\t\t\tDas ist (war) ein Satz mit Leerzeichen.\n\t\t</td>\n\t</tr>\n</table>"
Debug xmlstr
XML = ParseXML(#PB_Any, xmlstr)
FormatXML(XML, #PB_XML_ReIndent, 0)
FormatXML(XML, #PB_XML_CutNewline|#PB_XML_ReduceNewline)
Debug ComposeXML(XML)
Grüße ... Peter
a²+b²=mc²
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ToCastrate_XML_NodeText

Beitrag von NicTheQuick »

Mir fällt auch gerade auf, dass Purebasic Zeilenumbrüche in Attributen einfach wegoptimiert.

Code: Alles auswählen

xmlstr.s = ~"<table>\n\t<tr attr=\"first line\nsecond line\">\n\t\t<td>\n\t\t\tDas ist (war) ein Satz mit Leerzeichen.\n\t\t</td>\n\t</tr>\n</table>"
Debug xmlstr
XML = ParseXML(#PB_Any, xmlstr)
FormatXML(XML, #PB_XML_ReIndent, 0)
;FormatXML(XML, #PB_XML_CutNewline|#PB_XML_ReduceNewline)
Debug ComposeXML(XML) 
Laut Spezifikation sind alle Zeichen im Attribute erlaubt, außer "<" und "&" und natürlich dem entsprechenden Begrenzer ' oder ".
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: ToCastrate_XML_NodeText

Beitrag von Rudi »

@Kiffi
Das ist wohl eher die russische Variante. :mrgreen:
Leerzeichen am Anfang werden noch abgeschnitten.

@NicTheQuick
"Mir fällt auch gerade auf, dass Purebasic Zeilenumbrüche in Attributen einfach wegoptimiert."

Meines Wissens werden die im XML-Dokument maskiert. Mittlerweile sind auch "<" und "&" in PB erlaubt.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Re: ToCastrate_XML_NodeText

Beitrag von freak »

#PB_XML_CutSpace kann nützlich sein für XML bei dem die relevanten Inhalte ausschließlich als Attribut-Werte abgelegt sind und nicht als Elementen-Inhalt.
NicTheQuick hat geschrieben:Mir fällt auch gerade auf, dass Purebasic Zeilenumbrüche in Attributen einfach wegoptimiert.
Frau Werwolf sagt das gehört so. Das nennt sich "Attribute-Value Normalization": http://www.w3.org/TR/REC-xml/#AVNormalize

Aus diesem Grund werden Newlines in Attributen beim Setzen durch SetXMLAttribute() mit Character-Referenzen ersetzt damit diese eben nicht normalisiert werden. Siehe hier:

Code: Alles auswählen

XML = ParseXML(#PB_Any, "<test/>")
SetXMLAttribute(MainXMLNode(XML), "value", ~"Line1\nLine2")
Debug ComposeXML(XML)
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: ToCastrate_XML_NodeText

Beitrag von Rudi »

freak hat geschrieben:#PB_XML_CutSpace kann nützlich sein für XML bei dem die relevanten Inhalte ausschließlich als Attribut-Werte abgelegt sind und nicht als Elementen-Inhalt.
Genau so musse ich es letztendlich auch machen. Als Bug melden?

Achso: Wollte noch zeigen, dass das Apostroph und das Anführungszeichen auch Entity-maskiert werden:

Code: Alles auswählen

XML = ParseXML(#PB_Any, "<test/>")
SetXMLAttribute(MainXMLNode(XML), "value", ~"\n \" ' < > &")
Debug ComposeXML(XML)
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Antworten