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