C # String.Заменить двойные кавычки и литералы - PullRequest
16 голосов
/ 13 ноября 2008

Я довольно новичок в c #, поэтому я спрашиваю об этом здесь.

Я использую веб-сервис, который возвращает длинную строку значений XML. Поскольку это строка, все атрибуты избежали двойных кавычек

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

Вот моя проблема. Я хочу сделать простой string.replace. Если бы я работал в PHP, я бы просто запустил strip_slashes ().

Тем не менее, я нахожусь в C #, и я не могу понять это. Я не могу выписать свое выражение, чтобы заменить двойные кавычки ("), потому что оно завершает строку. Если я избегаю его, то оно дает неправильные результаты. Что я делаю неправильно?

    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: чтобы включить кавычку в необработанную строку, вам нужно ее удвоить.

Это важная информация, пробуя этот подход сейчас ... Там тоже не повезло Здесь что-то происходит с двойными кавычками. Концепции, которые вы все предлагаете, являются твердыми, НО проблема здесь связана с двойными кавычками, и, похоже, мне потребуется провести дополнительное исследование, чтобы решить эту проблему. Если кто-то что-то придумает, пожалуйста, напишите ответ.

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>"

Ответы [ 4 ]

21 голосов
/ 13 ноября 2008

следующее утверждение в C #

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

будет на самом деле хранить значение

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

, тогда как

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

имеет значение

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

для второго случая, вам нужно заменить слэш () на пустую строку, как следует

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

результат будет

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

P.S.

  1. косая черта (\) является escape-символом по умолчанию в C #
  2. чтобы игнорировать косые черты, используйте @ в начале строки
  3. если используется @, escape-символ - двойная кавычка (")
2 голосов
/ 13 ноября 2008

Нет никакой причины использовать регулярное выражение вообще ... это намного тяжелее, чем вам нужно.

string xmlSample = "blah blah blah";

xmlSample = xmlSample.Replace("\\\", "\"");
2 голосов
/ 13 ноября 2008

И строка, и регулярное выражение используют \ для экранирования. Регулярное выражение увидит символ \, за которым следует ", и подумает, что это буквальный выход Попробуйте это:

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

Вы также можете использовать необработанные строки (также известные как строки veratim) в C #. Они имеют префикс @, и все обратные слэши обрабатываются как обычные символы. Чтобы включить кавычку в необработанную строку, нужно удвоить ее.

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

1 голос
/ 13 ноября 2008

Если вы получаете строку XML, почему бы не использовать XML вместо строк?

у вас будет доступ ко всем элементам и атрибутам, и это будет намного проще и быстрее, если использовать пространство имен System.Xml

в вашем примере вы получаете эту строку:

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

Все, что вам нужно сделать, это преобразовать эту строку в документ XML и использовать ее, например:

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/>";
}

в ASP.NET это выведет в Literal1 что-то вроде:

item
att1 = value
att2 = value2

Как только у вас есть элемент в XmlElement, очень легко найти и получить значения и имена для того, что находится в этом элементе.

попробуйте, я часто использую его для получения ответов WebServices и для сохранения чего-либо в файле XML в качестве настроек, например, для небольшого приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...