PowerShell Sonderzeichen werden falsch interpretiert

Die wilde Inge

Commander
Registriert
Aug. 2009
Beiträge
2.157
Moin,

ich erzeuge mit ner Powershell eine XML, dort möchte ich im Text Sonderzeichen verwenden wie < und >.
Wenn ich nun also "< " schreibe, wird das bei der Ausgabe als " &lt;" übersetzt.
Aber wenn ich "&lt;" schreibe, wird das wiederum als "&amp;lt;" übersetzt.

Er erkennt also "&lt;" nicht als als zusammenhängend, sondern intepriert nur das & als &amp.

Abgesehen mal davon, dass es schon reichlich dämlich ist, dass ein Sonderzeichen in der Notation vorkommt, das selber interpretiert werden muss, kann ich mir das Verhalten 0 erklären. In keiner einzigen Anleitung steht irgendwas, dass man die Nutzung von Sonderzeichen irgendwie erst noch aktivieren müsste, daher weiß ich leider nicht weiter.

Selbst wenn ich das Sonderzeichen oder die Notation in einer Variable verstecke, kommt das gleiche Ergebnis.

Jemand eine Idee?
 
Das ist auch korrekt so. <> leitet in XML nun mal Tags ein. Wenn die in nem Value vorkommen, müssen die durch ihre Entities escaped werden. Wenn du das nicht willst, nutz CDATA Blöcke. Wenn du das willst, musst du neue XML Knoten hinzufügen. Sonst wird Text escaped.
 
  • Gefällt mir
Reaktionen: sikarr
Hi,
erstmal danke für deine Antwort, ich bin mir jetzt nicht sicher ob wir aneinander vorbei sprechen.
Dass < und > ersetzt werden müssen ist mir klar, aber genau das funktioniert ja nicht.
Auch alle anderen Sonderzeichen lassen sich nicht maskieren.

Aus
&quot; wird &amp;quot;
&apos; wird &amp;apos;
und aus
&amp; wird &amp;amp;

sprich: ich kann kein einziges Sonderzeichen maskieren.

Was meinst du mit neuen XML Knoten? Es soll einfach nur ganz normaler Freitext sein. Ich will kein Freitext abgwechselt mit neuen Knoten, das soll alles nur Text sein.
Ergänzung ()

CDATA klappt übrigens auch nicht :hammer_alt:

Aus $xmlWriter.WriteElementString("value","<![CDATA [ < test123 ]]> macht er mir

Aus $xmlWriter.WriteElementString("value","&lt;![CDATA .... :freak:
 
Zuletzt bearbeitet:
Die wilde Inge schrieb:
Dass < und > ersetzt werden müssen ist mir klar, aber genau das funktioniert ja nicht.
Doch, das hast du sogar bereits ausgeführt.
Die wilde Inge schrieb:
Wenn ich nun also "< " schreibe, wird das bei der Ausgabe als " &lt;" übersetzt.
Die wilde Inge schrieb:
Auch alle anderen Sonderzeichen lassen sich nicht maskieren.

Aus
&quot; wird &amp;quot;
&apos; wird &amp;apos;
und aus
&amp; wird &amp;amp;
Das hast du auch bereits angerissen.
Die wilde Inge schrieb:
Aber wenn ich "&lt;" schreibe, wird das wiederum als "&amp;lt;" übersetzt.
Ein & wird eben zu einem &amp; escaped. Das ist gängige Praxis in XML.
Die wilde Inge schrieb:
sprich: ich kann kein einziges Sonderzeichen maskieren.
Doch, der XmlWriter macht das bereits vollkommen korrekt für dich. Du versuchst nur die Spezifikation zu umgehen.
Die wilde Inge schrieb:
Was meinst du mit neuen XML Knoten? Es soll einfach nur ganz normaler Freitext sein. Ich will kein Freitext abgwechselt mit neuen Knoten, das soll alles nur Text sein.
Du willst Sonderzeichen nutzen, am Beispiel < und >. Beide sind aber für XML-Tags zuständig, ergo werden sie bei Textwerten als &lt; und &gt; escaped. Wenn du trotzdem deine < und > Zeichen haben willst, musst du ein neues Tag eröffnen. Das hat natürlich nicht den gewollten Effekt von dir (Text so darzustellen), aber das ist die einzige Möglichkeit beide Zeichen in einen Wert zu bekommen. Mal ab davon, dass das ebenso wieder gegen die Spezifikation verstößt...

Also:
  • Nimm &lt;, &gt;, &amp; und andere Sonderzeichen als gegeben hin. Das ist standardkonform und jeder Parser kommt damit zurecht. Alternativ kannst du auch den Hex-Code verwenden. Für < entsprechend &#60;.
oder
  • nutz CDATA-Tags
Die wilde Inge schrieb:
Aus $xmlWriter.WriteElementString("value","<![CDATA [ < test123 ]]> macht er mir

Aus $xmlWriter.WriteElementString("value","&lt;![CDATA .... :freak:
CDATA-Tags sind auch kein Wert, sondern echte XML-Tags. XmlWriter.WriteCData(String)
PHuV schrieb:
Was ist mit dem klassischen \ als Escape Markierung?
Hat nix mit XML zu tun. In PowerShell escaped man übrigens mit nem Backtick `.
 
Zuletzt bearbeitet:
Die wilde Inge schrieb:
sprich: ich kann kein einziges Sonderzeichen maskieren.
Aus dem ganz einfachen Grund dass du es auch gar nicht selber machen musst. Du hast doch schon geschrieben das aus einem < ein &lt; wird, dann passt doch alles?
 
Achso, jetzt habe ich es kapiert.

Ich war genau umgedreht davon ausgegangen, dass wenn ich &lt; schreibe, dass ich dann in der Ausgabe ein < zu sehen bekommen.
Mit der &lt; -Ausgabe wird das Lesen (mit den Augen ;)) der XML natürlich etwas schwerer.

Danke für den Tipp
 
Die wilde Inge schrieb:
Ich war genau umgedreht davon ausgegangen, dass wenn ich &lt; schreibe, dass ich dann in der Ausgabe ein < zu sehen bekommen.
Bekommst du auch. Es wird in der XML nur anders kodiert.

Roh:
1570008073754.png


Escaped:
1570008086674.png


CDATA:
1570008098169.png
 
Zurück
Oben