16 Stimmen

C# String.Replace doppelte Anführungszeichen und Literale

Ich bin ziemlich neu in c#, so dass ist, warum ich dies hier fragen.

Ich verwende einen Webdienst, der eine lange Zeichenfolge von XML-Werten zurückgibt. Da es sich um eine Zeichenkette handelt, sind alle Attribute in Anführungszeichen gesetzt

string xmlSample = "<root><item att1=\"value\" att2=\"value2\" /></root>"

Hier ist mein Problem. Ich möchte eine einfache string.replace tun. Wenn ich in PHP arbeiten würde, würde ich einfach strip_slashes() ausführen.

Allerdings bin ich in C# und ich kann nicht für das Leben von mir herausfinden, es. Ich kann meinen Ausdruck nicht ausschreiben, um die doppelten Anführungszeichen (") zu ersetzen, weil es die Zeichenfolge beendet. Wenn ich es zu entkommen, dann hat es falsche Ergebnisse. Was mache ich falsch?

    string search = "\\\"";
    string replace = "\"";
    Regex rgx = new Regex(search);
    string strip = rgx.Replace(xmlSample, replace);

    //Actual Result  <root><item att1=value att2=value2 /></root>
    //Desired Result <root><item att1="value" att2="value2" /></root>

MizardX: Um ein Anführungszeichen in eine Rohzeichenkette einzufügen, müssen Sie es verdoppeln.

Das ist eine wichtige Information, die ich jetzt ausprobiere... Auch hier kein Glück Irgendetwas ist hier mit den Anführungszeichen los. Die Konzepte, die Sie alle vorschlagen, sind solide, ABER das Problem hier ist der Umgang mit den doppelten Anführungszeichen, und es sieht so aus, als müsste ich einige zusätzliche Recherchen anstellen, um dieses Problem zu lösen. Wenn jemandem etwas einfällt, bitte eine Antwort posten.

string newC = xmlSample.Replace("\\\"", "\"");
//Result <root><item att=\"value\" att2=\"value2\" /></root> 

string newC = xmlSample.Replace("\"", "'");
//Result newC   "<root><item att='value' att2='value2' /></root>"

22voto

ala Punkte 6550

Die folgende Anweisung in C#

string xmlSample = "<root><item att1=\"value\" att2=\"value2\" /></root>"

speichert tatsächlich den Wert

<root><item att1="value" att2="value2" /></root>

während

string xmlSample = @"<root><item att1=\""value\"" att2=\""value2\"" /></root>";

haben den Wert von

<root><item att1=\"value\" att2=\"value2\" /></root>

Im zweiten Fall müssen Sie den Schrägstrich () wie folgt durch eine leere Zeichenfolge ersetzen

string test = xmlSample.Replace(@"\", string.Empty);

wird das Ergebnis sein

<root><item att1="value" att2="value2" /></root>

P.S.

  1. Schrägstrich ( \ ) ist das Standard-Escape-Zeichen in C#
  2. um Schrägstriche zu ignorieren, verwenden Sie @ am Anfang der Zeichenkette
  3. wenn @ verwendet wird, ist das Escape-Zeichen ein doppeltes Anführungszeichen (")

3voto

Timothy Khouri Punkte 30565

Es gibt keinen Grund, überhaupt einen regulären Ausdruck zu verwenden... das ist viel schwerer als das, was Sie brauchen.

string xmlSample = "blah blah blah";

xmlSample = xmlSample.Replace("\\\", "\"");

2voto

Markus Jarderot Punkte 83090

Sowohl die Zeichenfolge als auch der Regex verwenden \ für die Flucht. Die Regex sieht das Zeichen \ gefolgt von " und denken, es sei eine buchstäbliche Flucht. Versuchen Sie dies:

Regex rgx = new Regex("\\\\\"");
string strip = rgx.Replace(xmlSample, "\"");

Sie können auch Raw Strings (auch bekannt als Veratim Strings) in C# verwenden. Sie sind mit dem Präfix @ , und alle umgekehrten Schrägstriche werden wie normale Zeichen behandelt. Um ein Anführungszeichen in eine rohe Zeichenkette einzufügen, müssen Sie es verdoppeln.

Regex rgx = new Regex(@"\""")
string strip = rgx.Replace(xmlSample, @"""");

1voto

balexandre Punkte 71124

Wenn Sie eine XML-Zeichenkette erhalten, warum nicht XML statt Zeichenketten verwenden?

haben Sie Zugriff auf alle Elemente und Attribute, und es ist viel einfacher und extrem schnell, wenn Sie den System.Xml-Namensraum verwenden

in Ihrem Beispiel erhalten Sie diese Zeichenfolge:

string xmlSample = "<root><item att1=\"value\" att2=\"value2\" /></root>";

Sie müssen diese Zeichenfolge nur in ein XML-Dokument umwandeln und verwenden, z. B:

System.Xml.XmlDocument xml = new System.Xml.XmlDocument();
xml.LoadXml(xmlSample);

System.Xml.XmlElement _root = xml.DocumentElement;

foreach (System.Xml.XmlNode _node in _root)
{
    Literal1.Text = "<hr/>" + _node.Name + "<br/>";
    for (int iAtt = 0; iAtt < _node.Attributes.Count; iAtt++)
        Literal1.Text += _node.Attributes[iAtt].Name + " = " + _node.Attributes[iAtt].Value + "<br/>";
}

in ASP.NET wird dies an die Literal1 etwas wie ausgeben:

item
att1 = value
att2 = value2

Sobald Sie das Element in einem XmlElement haben, ist es sehr einfach, die Werte und Namen zu suchen und zu erhalten, was in diesem Element ist.

Probieren Sie es aus, ich verwende es häufig, wenn ich WebServices-Antworten abrufe und wenn ich etwas in einer XML-Datei speichere, z. B. Einstellungen für eine kleine Anwendung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X