2008-11-12 26 views
14

Soy bastante nuevo en C#, así que por eso lo estoy preguntando aquí.C# String.Sustituir comillas dobles y literales

Estoy consumiendo un servicio web que devuelve una larga cadena de valores XML. Debido a que esta es una cadena todos los atributos han escapado de las comillas dobles

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

Aquí está mi problema. Quiero hacer un simple string.replace. Si estuviera trabajando en PHP, solo correría strip_slashes().

Sin embargo, estoy en C# y no puedo por la vida de mi entenderlo. No puedo escribir mi expresión para reemplazar las comillas ("), ya que termina la cadena Si escapar de ella entonces se ha resultados incorrectos Qué estoy haciendo mal

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:..? Para incluir una cita en una cadena de texto que necesita para duplicarlo.

eso es información importante, tratando de que el enfoque ahora ... No hubo suerte allí tampoco hay algo que hacer aquí con las comillas dobles. los conceptos que todas están sugiriendo que son sólidos, PERO el problema aquí es lidiar con las comillas dobles y parece que tendré que hacer un poco de addit investigación ional para resolver este problema. Si a alguien se le ocurre algo, publique una respuesta.

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

Definitivamente no use Regexes aquí, solo use la función Reemplazar! – Domenic

+0

Vea la última respuesta - Ha logrado lo que quiere, es la forma en que lo está mirando que lo está ensuciando. –

+0

Estoy de acuerdo, yo Ni siquiera puedo ver el problema aquí. Las barras no son un personaje real s en la cuerda, ¡son marcadores de escape! –

Respuesta

20

la siguiente declaración en C#

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

en realidad almacenar el valor

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

mientras que

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

tienen el valor de

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

para el segundo caso, es necesario sustituir la barra() por cadena vacía como sigue

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

el resultado será

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

P. S.

  1. barra (\) es de escape predeterminada en C#
  2. hacer caso omiso de barras, el uso @ al comienzo de la cadena
  3. si se utiliza @, el carácter de escape es doble comillas (")
2

Tanto la cadena y la expresión regular utiliza \ para escapar. La expresión regular verá el carácter \ seguido de ", y creo que es un escape literal. Prueba esto:

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

También es posible usar cuerdas primas (también conocido como cadenas veratim) en C#. Están prefijados con @, y todas las barras diagonales inversas se tratan como caracteres normales. Para incluir una cita en una cadena sin formato, debe duplicarla.

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

2

No hay razón para usar una expresión regular en todo ... eso es mucho más pesado que lo que necesita.

string xmlSample = "blah blah blah"; 

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

debería leer: xmlSample = xmlSample.Replace ("\\\" "," \ ""); –

1

Si obtiene una cadena XML, ¿por qué no usar cadenas XML en su lugar?

tendrá acceso a todos los elementos y atributos y será mucho más fácil y muy rápido si se utiliza el espacio de nombres System.Xml

en su ejemplo que está recibiendo esta cadena:

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

Todos lo que necesita hacer es convertir esa cadena en un Documento XML y usarlo, como:

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

en ASP.NET esta salida a la voluntad Literal1 algo como:

item 
att1 = value 
att2 = value2 

una vez que tenga el elemento en un XmlElement, es muy fácil de buscar y obtener los valores y los nombres de lo que hay en ese elemento.

pruébalo, lo uso mucho cuando recupero respuestas de WebServices y cuando almaceno algo en un archivo XML como configuraciones para una aplicación pequeña, por ejemplo.

Cuestiones relacionadas