Seite 1 von 1
ToCastrate_XML_NodeText
Verfasst: 23.12.2015 15:03
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?
Re: ToCastrate_XML_NodeText
Verfasst: 23.12.2015 15:11
von Kiffi
ich würde sagen: Feature
PB-Hilfe hat geschrieben:#PB_XML_CutSpace : Removes all spaces
Grüße ... Peter
Re: ToCastrate_XML_NodeText
Verfasst: 23.12.2015 15:17
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)
Re: ToCastrate_XML_NodeText
Verfasst: 23.12.2015 15:21
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
Re: ToCastrate_XML_NodeText
Verfasst: 23.12.2015 15:30
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 ".
Re: ToCastrate_XML_NodeText
Verfasst: 23.12.2015 15:50
von Rudi
@Kiffi
Das ist wohl eher die russische Variante.

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.
Re: ToCastrate_XML_NodeText
Verfasst: 23.12.2015 19:55
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)
Re: ToCastrate_XML_NodeText
Verfasst: 23.12.2015 23:18
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)