С# String.Replace двойные кавычки и литералы

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

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

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

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

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

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

Ответы

Ответ 1

следующий оператор в С#

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.

  • slash (\) - это escape-символ по умолчанию в С#
  • чтобы игнорировать косые черты, используйте @в начале строки
  • Если используется @, escape-символ - это двойная кавычка (")

Ответ 2

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

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

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

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

Ответ 3

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

string xmlSample = "blah blah blah";

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

Ответ 4

Если вы получаете строку 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 файле в качестве параметров для небольшого приложения, например.