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. :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.

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)