2011-01-13 25 views
15

que tengo un xml como:Cómo escribir los CDATA XML

<?xml version="1.0" encoding="UTF-8"?> 
<entry> 
    <entry_id></entry_id> 
    <entry_status></entry_status> 
    </entry> 

estoy escribiendo datos en ella como:

XmlNode xnode = xdoc.SelectSingleNode("entry/entry_status"); 
xnode.InnerText = "<![CDATA[ " + Convert.ToString(sqlReader["story_status"]) + " ]]>" ;  

pero su cambio "<" a "& lt" de CDATA . Por favor dígame cómo completar los valores en el xml anterior como formato CData.

sé que podemos crear CDATA como:

XmlNode itemDescription = doc.CreateElement("description"); 
XmlCDataSection cdata = doc.CreateCDataSection("<P>hello world</P>"); 
itemDescription.AppendChild(cdata); 
item.AppendChild(itemDescription); 

pero mi proceso es leer nodo de XML y cambiar su valor no anexar en ella. Gracias

Respuesta

14

¿Te realmente lo necesitan estar en CDATA, o hacer lo que desea obtener el texto de ahí de una manera que no requerirá adicional escapando en tu código?

InnerText haga que cualquier escape se requiere, por lo general, yo sólo uso

xnode.InnerText = Convert.ToString(sqlReader["story_status"]); 

... pero si realmente desea una CDATA node, puede crear uno usted mismo de acuerdo con la respuesta de Nekresh.

+0

Genial, eso significa la forma en que estoy escribiendo en xml. el carácter de expulsión se manejará automáticamente y el lector xml no tendrá problemas y mi xml no se romperá ... ¿correcto? –

+0

@ Rajesh: Exactamente. Puede ver que la configuración de la propiedad 'InnerText' realiza el escapado porque es exactamente por eso que su enfoque actual no funciona; está escapando del texto"

16

Como se describe aquí: msdn

// Create an XmlCDataSection from your document 
var cdata = xdoc.CreateCDataSection(Convert.ToString(sqlReader["story_status"])); 

// Append the cdata section to your node 
xnode.AppendChild(cdata); 
+0

I dont wants to append. quiero cambiar su valor ... los elementos ya están ahí –

0

Puede utilizar writer.WriteCData(value);

donde el escritor es XmlWriter objeto.

1

Use Node.InnerXml, not Node.InnerText. Node.InnerText está reemplazando automáticamente los valores especiales. Tenga en cuenta que si especifica con CDATA en InnerXml, entonces Node.InnerText es texto en CDATA. Ejemplo:

public class Test 
{ 
    public static int Main(string[] args) 
    { 
     const string xmlTxt = @"<?xml version=""1.0"" encoding=""UTF-8""?> 
<entry> 
    <entry_id></entry_id> 
    <entry_status></entry_status> 
    </entry>"; 
     TextReader treader = new StringReader(xmlTxt); 
     XmlReader xreader = XmlReader.Create(treader); 
     XmlDocument xdoc = new XmlDocument(); 
     xdoc.Load(xreader); 

     XmlNode xnode = xdoc.SelectSingleNode("entry/entry_status"); 
     //xnode.InnerText = "<![CDATA[something]]>"; 
     xnode.InnerXml = "<![CDATA[something]]>"; 
     Console.WriteLine("inner text is: " + xnode.InnerText); 

     xdoc.Save(Console.Out); Console.WriteLine(); 

     return 0; 
    } 
} 

salida del programa:

 
inner text is: something 
<?xml version="1.0" encoding="ibm852"?> 
<entry> 
    <entry_id> 
    </entry_id> 
    <entry_status><![CDATA[something]]></entry_status> 
</entry> 
10

Si realmente necesita una sección CDATA (ver Jon's answer), se puede lograr que de este modo:

XmlNode xnode = xdoc.SelectSingleNode("entry/entry_status"); 
XmlCDataSection cdata = xdoc.CreateCDataSection(Convert.ToString(sqlReader["story_status"])); 
xnode.InnerXml = cdata.OuterXml; 

Esto le reemplazar el contenido de xnode, no se le agrega.

2
XmlNode childNode = node.ChildNodes[0]; 
if (childNode is XmlCDataSection) 
{ 
    XmlCDataSection cdataSection = childNode as XmlCDataSection; 
    cdataSection.Value = newValue; 
}