2011-05-31 8 views
8

Cada vez que llama al método enXmlDocument.Save() inserta corchetes vacíos en declaración DOCTYPE

XmlDocument.Save(fooFilepath); 

inserta dos corchetes al final de la etiqueta DOCTYPE, por ejemplo,

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE ARCXML SYSTEM "G:\ArcIMS\DTD\arcxml.dtd"[]> 

¿Alguien sabe por qué esto podría pasar? Obviamente no quiero que esto suceda.

+3

Los corchetes son el lugar donde se colocan las declaraciones de subconjuntos internos. Si no tiene tales declaraciones, los corchetes están vacíos y pueden omitirse. Pero no está mal tener paréntesis vacíos. Cualquier analizador de XML conforme a las normas debería ser capaz de tratar con la declaración de tipo de documento generado, por lo que el único problema que tiene es estético. – dtb

+0

Después de verificar las implementaciones 'XmlWriter.WriteDocType()', me sorprende por qué un nuevo 'XDocumentType' con' internalSubset' establecido en 'null' da como resultado los corchetes vacíos vacíos. En mi caso, escribo a Response. Salida. Antes de llamar a 'Guardar()', confirmé que 'doc.DocumentType.InternalSubset' es nulo. Todas las implementaciones parecen omitir la salida '[]' pero en tiempo de ejecución está escrita en el XML por algo. –

Respuesta

5

Eso es a normal (and optional) part of a DOCTYPE declaration.

<!DOCTYPE rootname SYSTEM url [DTD]> 

Dónde DTD contiene ninguna declaración subconjunto interno a su documento.

+0

¡correcto! - No tenía idea, solo parecía extraño, pero si es válido, bueno, está todo bien. Aclamaciones. – Vidar

+0

¿Se puede prevenir? –

+0

Sí, es una sintaxis xml válida, pero algunos analizadores no pueden manejarlo. – wisbucky

2

El lector subyacente utilizado por XmlDocument (que utiliza XmlTextReader) no distingue entre un documento con un subconjunto interno vacío y una con ningún subconjunto interna especificada, por lo que volverá InternalSubset == "" para ambos casos.

Luego cuando se invoca XmlDocument.Save(), ve una cadena vacía para InternalSubset y debidamente escribe un subconjunto interno vacío: [].

Desafortunadamente, XmlDocument.DocumentType.InternalSubset es de solo lectura, por lo que no puede establecerlo como nulo. Usted puede hacer:

  1. Usar el nivel inferior XmlTextWriter.WriteDocType() tener más control.

  2. Use XDocument, donde puede establecer XDocument.DocumentType.InternalSubset = null.

Cuestiones relacionadas