none
Poner CDATA al crear XML RRS feed

  • Pregunta

  • Hola

    Trabajo con Visual Studio 2019, VB.NET

    Estoy poniendo un CDATA a un nodo que espera un string pero el CDATA es de tipo XCDATA al poner .ToString varia el formato

    Dim cdata As XCData = <![CDATA[CIENTO  OCHENTA Y  CINCO CON 00/100]]>
    
            Dim note = New NoteType()
            Dim noteArray = New List(Of NoteType)
            note.languageLocaleID = "1000"
            note.Value = cdata.ToString
            noteArray.Add(note)
            invoice.Note() = noteArray.ToArray()
            EscribirXML(invoice)

    Me sale de la siguiente manera &lt;![CDATA[CIENTO  OCHENTA Y  CINCO CON 00/100]]&gt;

    Necesito que quede de esta manera: <![CDATA[CIENTO  OCHENTA Y  CINCO CON 00/100]]>

    ¿Como lo puedo solucionar?

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 19 de abril de 2021 2:20

Todas las respuestas

  • ¿Recuerdas cuando en una respuesta anterior te expliqué el el CData no es realment un tipo de dato en XML, sino que solo se usa para "escapar" los caracteres especiales dentro de un string? Y también te comenté que si usas el serializador XML para serializar una clase con datos, el serializador ya "escapa" los caracteres especiales que se encuentre en los strings por lo que no requiere un CData.

    Pues bien, eso es lo que te está pasando: Has metido un CData con todos sus caracteres especiales dentro de un string en una clase. Y luego has serializado esa clase. Entonces el serializador escapa los caracteres especiales y te queda como estás viendo.

    El resumen de todo ello es que los dos mecanismos son incompatibles. O bien usas solamente la serialización, en cuyo caso no puedes meter un CData sino que se genera su equivalente mediante caracteres escapados (y en teoría debería darle lo mismo al programa que recibe el XML, si está bien hecho). O bien generas todo el XML con XDocument o XmlDocument, en cuyo caso sí que puedes generar el CData pero no puedes usar la clase que generaste con XSD. Otra cosa que puedes hacer, pero es una chapuza horrible, es serializar la clase, cosa que producirá un XML sin el CData, y luego abrir el archivo en modo texto y reemplazar dentro del texto la porción donde quieres el CData. Y la opción idónea es prescindir del CData y explicarle a quien vaya a recibir el archivo que resulta superfluo ese CData porque de acuerdo con las normas XML es completamente equivalente a una cadena escapada.

    lunes, 19 de abril de 2021 6:07
  • Hola @Alberto

    Si no le pongo los caracteres del CDATA sería valido el xml?


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 19 de abril de 2021 21:03
  • Si no le pongo los caracteres del CDATA sería valido el xml?

    Sí, siempre que estén debidamente escapados.

    Por ejemplo, si en el texto de ese elemento hay un carácter "<", que está reservado en XML, entonces hay dos opciones para meter el "<" dentro del texto:

    1) Encerrarlo dentro de un CDATA.

    2) Cambiar el "<" por "&lt;", que es su correspondiente escape, y lo mismo con todos los demás caracteres reservados que existan en el texto.

    Cuando serializas la clase, el serializador hace automáticamente la opción 2.

    martes, 20 de abril de 2021 6:30