mayho33
Goto Top

XML als String-Variable

Hi Community,

Ich stehe total am Schlauch bei einem Thema das eigentlich ganz einfach sein sollte. INet liefert nicht das gewüschte Ergebnis auf meine Fragen (ich stelle die Frage wohl nicht richtig 🤷‍♂️) und bitte deshalb um eure Hilfe.

Das Problem:
Ich habe eine sehr große XML erhalten die ich als String-Variable direkt im Code speichern will/muss und nicht als z.B. Embeded Ressource oder so. Die xml enthält einige Sonderzeichen ( ";{}[]><| ) dort wo sie innerhalb des String für C# ein Problem darstellen. Ich will aber nicht jede Zeile (1000e...) durchgehen und das korrigieren sondern C# verklickern, dass es gefälligst den String als String akzeptieren und nicht als XML oder XAML interpretieren soll, so wie es z.B Powershell macht/kann.

siehe in Powershell:
$myXMLasVariable = @"  
<?xml version="1.0" encoding="utf-8"?>  
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  
  <ErrorItem>
    <Id>12005</Id>
    <IdType>AGENT</IdType>
    <Message> The "<%hs>" is not valid.</Message>  
    <Messager>WINHTTP</Messager>
    <EvaluateAsError>true</EvaluateAsError>
  </ErrorItem>
...
...
...
...
</Configuration>
"@  


Komme aber irgendwie nicht dahinter wie das in C# sauber funktioniert (bsp):
string myXMLasVariable = @"";  
#oder
string myXMLasVariable = $@"";  

Kann mir jemand sagen wie ich das bewerkstellige?

Danke und beste Grüße!
Mayho

Content-ID: 71563807386

Url: https://administrator.de/contentid/71563807386

Ausgedruckt am: 22.11.2024 um 03:11 Uhr

8030021182
8030021182 18.11.2023 aktualisiert um 14:42:20 Uhr
Goto Top
Raw String Literals (C#11) are your friend ...
var message = """  
"This is a very important message."  
""";  
Built-in reference types (C# reference)
Ob man jetzt 2,3 oder mehr Quotes setzt kommt darauf an ob im String in einer Zeile diese Sequenenz alleine vorkommt.
Wichtig ist das die Anzahl der am Anfang gesetzten Quotes gleich der in der letzten Zeile ist.
Das hier geht also genauso
var message = """""  
"This is a very important message."  
""""";  

Gruß Katrin
mayho33
mayho33 18.11.2023 aktualisiert um 15:05:29 Uhr
Goto Top
Zitat von @8030021182:

Raw String Literals (C#11) are your friend ...
Ja genau das will ich vermeiden. bei einer XML mit 10.000 Zeilen und mehr ist das eine Wochenaufgabe... Siehe auch das Beispiel wie es in PS aussieht.
8030021182
8030021182 18.11.2023 aktualisiert um 15:30:03 Uhr
Goto Top
Zitat von @mayho33:

Zitat von @8030021182:

Raw String Literals (C#11) are your friend ...
Ja genau das will ich vermeiden. bei einer XML mit 10.000 Zeilen und mehr ist das eine Wochenaufgabe... Siehe auch das Beispiel wie es in PS aussieht.

? Genau das macht das doch, da musst du gar nichts bearbeiten, einfach nur dazwischen einfügen und fertig!
Das in einem XML """ oder """"" oder wenn du sicher gehen willst noch länger, alleine auf einer Zeile steht ist unwahrscheinlich zumal das ja schon gegen die XML-Rules verstößt.

Just read the manual above !
mayho33
mayho33 18.11.2023 aktualisiert um 15:34:08 Uhr
Goto Top
Ach so meinst du 🤣🤣, aber leider nein. Das habe ich schon versucht.

Aber vielleicht mit zuwenigen """""

Ich versuche es nochmal obwohl ich da wenig Hoffnung habe. Danke!
8030021182
8030021182 18.11.2023 aktualisiert um 15:57:15 Uhr
Goto Top
Zitat von @mayho33:

Ach so meinst du 🤣🤣, aber leider nein. Das habe ich schon versucht.

Dann hast du kein C#11.0, das funktioniert erst ab dieser Version , klappt hier nämlich einwandfrei damit, RTFM, da steht es doch klar und deutlich. 🤔

p.s. was ist der Grund warum du keine embedded resource nehmen willst/kannst??
mayho33
mayho33 18.11.2023 um 21:16:36 Uhr
Goto Top
Nein, kein C#11. Darum suche ich ja nach einer entsprechenden Lösung.


Zitat von @8030021182:
p.s. was ist der Grund warum du keine embedded resource nehmen willst/kannst??
Ist einfach eine Vorgabe an die ich mich halten muss.
Könnte natürlich auch eine XML im gleichen Verzeichnis deserialisieren, aber wie gesagt... Vorgabe.
8030021182
8030021182 18.11.2023 aktualisiert um 21:48:47 Uhr
Goto Top
Ich will aber nicht jede Zeile (1000e...) durchgehen
Lässt du halt einmal nen String.Replace() drüber laufen der die enthaltenen Anführungszeichen escaped, und packst das Ergebnis in ein @"" fertig, die anderen Sonderzeichen müssen darin ja nicht escaped werden nur die Anführungszeichen.
Das ist in wenigen Sekunden erledigt.
Krampf bleibt halt Krampf 🤪
mayho33
mayho33 18.11.2023 um 22:37:55 Uhr
Goto Top
Nein. So einfach ist es leider nicht. Das muss leider das Format gewahrt werden. Sonst versteht die andere Seite das nucht mehr...

Ich werde wohl auf C#11 updaten müssen...

Danke jedenfalls.
Crusher79
Crusher79 19.11.2023 um 00:21:36 Uhr
Goto Top
Warum die Datei nicht mitliefern? Embedden muss ja nicht 100% sein.

string xmlFile= File.ReadAllText("test.xml");  

Machbarkeit ist auch anderse gegeben. Nur so wäre es doch übersichtlicher oder?
mayho33
mayho33 19.11.2023 um 01:53:17 Uhr
Goto Top
Ja klar! Ich muss mich aber an eine Vorgabe halten. 🤷‍♂️ Warum? Keine Ahnung. Vielleicht will der Auftraggeber einfach nur sehen wie ich rot anlaufe 🤔🤣
8030021182
8030021182 19.11.2023 aktualisiert um 08:03:27 Uhr
Goto Top
Zitat von @mayho33:

Nein. So einfach ist es leider nicht. Das muss leider das Format gewahrt werden.
Wieso sollte sich das Format ändern wenn ich nur die Anführungszeichen per replace verdoppele??? Da ändert sich rein gar nichts am Format noch am Inhalt im Ergebnis der Variablen!
Sonst versteht die andere Seite das nucht mehr...
Die futeln dann im Code rum wenn sie keine Ahnung haben oder wie? 🙃

Ich werde wohl auf C#11 updaten müssen...
Dein Kunde dann aber auch 🤪

Solche Kunden machen später dann meist eh nur Ärger, IMHO Finger weg, lohnt nich, lass sie ihren Code mit ChatGPT schreiben das wird denen wohl genügen 🤣.