Pregunta

Estoy abriendo un archivo XML usando .NET XmlReader y guardo el archivo en otro nombre de archivo y parece que la declaración DOCTYPE cambia entre los dos archivos. Si bien el archivo recién guardado sigue siendo XML válido, me preguntaba por qué insistía en cambiar las etiquetas originales.

Dim oXmlSettings As Xml.XmlReaderSettings = New Xml.XmlReaderSettings()
oXmlSettings.XmlResolver = Nothing
oXmlSettings.CheckCharacters = False
oXmlSettings.ProhibitDtd = False
oXmlSettings.IgnoreWhitespace = True

Dim oXmlDoc As XmlReader = XmlReader.Create(pathToOriginalXml, oXmlSettings)
Dim oDoc As XmlDocument = New XmlDocument()
oDoc.Load(oXmlDoc)
oDoc.Save(pathToNewXml)

Lo siguiente (en el documento original):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">

se convierte (observe los caracteres [] al final):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd"[]>
¿Fue útil?

Solución

Probablemente la biblioteca analiza el elemento DOCTYPE en una estructura interna y luego convierte la estructura nuevamente en texto. No almacena el formulario de cadena original.

Otros consejos

Hay un error en System.Xml cuando configura XmlDocument.XmlResolver = null. La solución es crear un XmlTextWriter personalizado:

    private class NullSubsetXmlTextWriter : XmlTextWriter
    {
        public NullSubsetXmlTextWriter(String inputFileName, Encoding encoding)
            : base(inputFileName, encoding)
        {
        }
        public override void WriteDocType(string name, string pubid, string sysid, string subset)
        {
            if (subset == String.Empty)
            {
                subset = null;
            }
            base.WriteDocType(name, pubid, sysid, subset);
        }
    }

En su código, cree un nuevo NullSubsetXmlTextWriter (pathToNewXml, Encoding.UTF8) y pase ese objeto al método oDoc.Save ().

Aquí está el Microsoft donde puede leer sobre la solución alternativa (describe la solución pero no proporciona el código).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top