2009-02-25 19 views
14

Estoy usando el nuevo System.Xml.Linq para crear documentos HTML (Sí, conozco HtmlDocument, pero prefiero las clases XDocument/XElement). Tengo un problema al insertar   (o cualquier otra entidad HTML). Lo que he intentado ya:Cómo ingresar texto al usar XElement

  1. sólo poner texto en directo no funciona debido a que el & se excita int &. new XElement("h1", "Text to keep together.");

  2. he intentado analizar en el código XML sin usar los siguientes, pero barfs con este error:

    XElement.Parse; ("Texto   a mantener     juntos.")

    -> referencia a entidad no declarada 'nbsp'.`

  3. número tres Try tiene el siguiente aspecto. Si guardo en un archivo, solo hay un espacio, el   se pierde.


var X = new XDocument(new XElement("Name", KeepTogether("Hi Mom!"))); 
private static XNode KeepTogether(string p)` 
{ 
    return XElement.Parse("<xml>" + p.Replace(" ", "&#160;") + "</xml>").FirstNode; 
} 

no pude encontrar una manera de empujar simplemente el texto en bruto a través sin conseguir que se escapó. ¿Me estoy perdiendo algo obvio?

+0

¿Puede proporcionar el XML que intenta analizar y generar? –

+1

Ooops. El no vino. Eche otro vistazo. – Eric

Respuesta

14

I couldn't find a way to just shove the raw text through without it getting escaped.

Sólo hay que poner el carácter Unicode en que & nbsp; se refiere a (U + 00A0 NO-BREAK SPACE) directamente en un nodo de texto, luego deja que el serializador se preocupe si necesita escaparse a & # 160; o no. (Probablemente no: si está utilizando UTF-8 o ISO-8859-1 ya que la página de codificación del personaje se puede incluir directamente sin tener que preocuparse por la codificación en una referencia de entidad o referencia de carácter).

new XElement("h1", "Text\u00A0to\u00A0keep\u00A0together"); 
1

También podría intentar usar entidades numeradas, no necesitan ninguna declaración. Entidad numerada equivalente a la entidad nombrada & nbsp; es & # 160;

+1

que sufriría el mismo problema que en & se escapó. – BCS

1

A diferencia del amplificador (&), lt (<) etc, nbsp no es una entidad conocida por XML, por lo que debe declararlo. en XML, p. &xyz; se trata como una entidad, el analizador hará referencia a su valor para producir el resultado.

// the xml, plz remove '.' within xml 
string xml = "<xml>test&.n.b.s.p;test</xml>"; 

// declare nbsp as xml entity and its value is " " in this case. 
string declareEntity = "<!DOCTYPE xml [<!ENTITY nbsp \" \">]>"; 

XElement x = XElement.Parse(declareEntity + xml); 
// output with a space between tests 
// <xml>test test</xml> 

o

// plz remove '.' in the string 
XElement.Parse("<xml>" + HttpUtility.HtmlEncode("Text&.n.b.s.p;keep everything") + "</xml>"); 
+0

Esto permite analizar en el XML. Sin embargo, si agrego hacer un x.Save ("test.xml"), el archivo de salida tiene un carácter de espacio en lugar de entre las dos palabras de prueba. Argh !!! – Eric

+0

¿Puedes reemplazar el espacio con & nbsp cuando sea necesario? p.ej. en contexto HTML. –

+0

Estoy creando un documento html grande, y luego doc.Save(). Esta ubicación está en el fondo del documento y no es fácil de encontrar. Por ahora voy a hackearlo y eliminar el espacio (es entre un tiempo y AM/PM). 6:30 PM estará bien. ¡Gracias por tu ayuda, sin embargo! – Eric

0
&amp;nbsp; 
+0

Esto dará como resultado: '& amp; nbsp;' –

0

me ocurrió con este enfoque un poco tonto que se adapte a mí: cadena de reemplazo todo el & con ## AMP ## cuando vaya a guardar los datos .... y revertir esa operación en la salida . Estoy usando esto junto con la columna XElement SQL y funciona de maravilla.

Saludos

Neil

+0

No necesariamente tonto - parecía ser más rápido que un 'Parse' extra para mí - http://stackoverflow.com/questions/5723146/is-here -an-xelement-equivalent-to-xmlwriter-writeraw/21098659 # 21098659 – drzaus

2

Sustitución de la & con un marcador como ## AMP ## resolvió mi problema. Quizás no sea la solución más bonita pero tengo una demo para un cliente en 10 minutos así que ... No me importa :)

Thx por la idea

+0

Parece ser la única forma que he encontrado, cuando REALMENTE necesita la cadena de salida real para tener, por ejemplo, un ' ' en él y no una nueva línea real o '& # 10;.' –

2

Sé que esto es viejo, pero me encontré con algo y ¡Estoy bastante sorprendido!

XElement element = new XElement("name",new XCData("<br /> & etc")); 

Y listo! Texto CDATA!

+0

El problema es que resultado de la (nueva XElement ("nombre", nueva XCData (" "))) ToString es . – IvanH

1

Puede pegar el carácter como desee verlo si lo copia en otro lugar. Viusal studio lo permite. Aunque esto es difícil de hacer si necesita  , es fácil si necesita cualquier símbolo, por ejemplo:

& toro ... acaba de pegar •

& Harr; ... simplemente pegue ↔