2011-10-03 20 views
7

Tengo una función en la que paso una cadena como parámetros llamada filterXML que contiene '&' en una de las propiedades.XmlDocument throwing "Ocurrió un error al analizar EntityName"

Sé que XML no lo reconocerá y me arrojará un error. Aquí está mi código:

public XmlDocument TestXMLDoc(string filterXml) 
{ 
    XmlDocument doc = new XmlDocument(); 
    XmlNode root = doc.CreateElement("ResponseItems"); 

    // put that root into our document (which is an empty placeholder now) 
    doc.AppendChild(root); 

    try 
    { 
     XmlDocument docFilter = new XmlDocument(); 
     docFilter.PreserveWhitespace = true; 

     if (string.IsNullOrEmpty(filterXml) == false) 
      docFilter.LoadXml(filterXml); //ERROR THROWN HERE!!! 

¿Qué debo cambiar en mi código para editar o analizar filterXml? Mi filterXML se ve así:

<Testing> 
<Test>CITY & COUNTY</Test> 
</Testing> 

estoy cambiando mi valor de cadena de & a &. Aquí está mi código para que:

string editXml = filterXml; 
    if (editXml.Contains("&")) 
    { 
     editXml.Replace('&', '&amp;'); 
    } 

Pero me facilita un err en el interior de la sentencia if: Demasiados literales.

+0

Se está produciendo un error debido al ampersand (&) –

+0

Esto es tarde en el juego, pero en caso de que alguien más se tropiece con él - el error "Demasiados literales" es causado por el hecho de que Gunda utilizó comillas simples alrededor de su "& ". Las comillas simples indican caracteres, que solo pueden tener un solo carácter. – Euric

Respuesta

13

El archivo que se muestra arriba no está bien formado XML porque el ampersand no se escapó.

Usted puede tratar con:

<Testing> 
    <Test>CITY &amp; COUNTY</Test> 
</Testing> 

o:

<Testing> 
    <Test><![CDATA[CITY & COUNTY]]></Test> 
</Testing> 
+1

Estoy haciendo algo como esto: string editXml = filterXml; if (editXml.Contains ("&")) { editXml.Replace ('&', '&'); } –

+0

Pero me está dando un error: Demasiados literales. –

+0

La opción 2 es un poco exagerada y, en general, no es muy útil en este caso. –

1

Para especificar un símbolo de unión en XML que debe utilizar &amp; ya que el signo de signo ('&') tiene un significado especial en XML .

2

Acerca de la segunda pregunta: hay dos firmas para String.Replace. Uno que toma caracteres, el otro que toma cuerdas. El uso de comillas simples intenta construir literales de caracteres, pero "& amp;", para C#, es realmente una cadena (tiene cinco caracteres).

¿Funciona con comillas dobles?

editXml.Replace("&", "&amp;"); 

Si le gustaría ser un poco más conservador, también se puede escribir código para garantizar que los & s va a sustituir no son seguidos por una de

amp; quot; apos; gt; lt; or # 

(pero esto todavía no es un filtrado perfecto)

Cuestiones relacionadas