2008-11-12 3 views
2

Я открываю XML-файл с использованием .NET XmlReader и сохраняю файл в другом имени файла, и кажется, что DOCTYPE-объявление изменяется между двумя файлами. Хотя недавно сохраненный файл по-прежнему является действительным XML, мне было интересно, почему он настаивал на изменении исходных тегов..NET XmlDocument: Почему DOCTYPE изменяется после сохранения?

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) 

Следующая (в оригинальном документе):

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

становится (обратите внимание на [] символов в конце):

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

ответ

1

Вероятно, библиотека разбирает DOCTYPE элемент в внутренняя структура, а затем преобразует структуру обратно в текст. Он не сохраняет исходную строчную форму.

7

При установке XmlDocument.XmlResolver = null появляется ошибка в System.Xml. Чтобы обойти эту проблему, чтобы создать пользовательский XmlTextWriter:

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); 
     } 
    } 

В своем коде, создать новый NullSubsetXmlTextWriter (pathToNewXml, Encoding.UTF8) и передать этот объект методу oDoc.Save().

Вот Microsoft support case, где вы можете прочитать об обходном пути (описывается обходное решение, но не предоставляется код).

+0

+1 потому что это работает. Тем не менее, это привело к тому, что мой HTML/XML был отформатирован в стиле фанк, который трудно читается. Для другого варианта этот ответ работал без обмена форматом документа: http://stackoverflow.com/a/16451790/279516. – 2016-08-08 16:49:39