Pergunta

Estou abrindo um arquivo XML usando .NET XmlReader e salvar o arquivo em outro arquivo e parece que a declaração DOCTYPE muda entre os dois arquivos. Enquanto o arquivo recém-salvo ainda é um XML válido, eu estava perguntando por que ele insistia em mudar etiquetas originais.

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)

A seguir (no documento original):

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

torna-se (note o [] caracteres no final):

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

Solução

Provavelmente a biblioteca analisa o elemento DOCTYPE em uma estrutura interna e, em seguida, converte a estrutura de volta ao texto. Ele não armazena a forma string original.

Outras dicas

Há um erro no System.Xml quando você definir XmlDocument.XmlResolver = null. A solução é criar um 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);
        }
    }

Em seu código, crie um novo NullSubsetXmlTextWriter (pathToNewXml, Encoding.UTF8) e passar esse objeto para o método oDoc.Save ().

Aqui está a Microsoft apoio caso onde você pode ler sobre a solução (que descreve a solução alternativa, mas não fornece o código).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top