2008-11-12 3 views
2

.NET XmlReader를 사용하여 XML 파일을 열고 다른 파일 이름으로 파일을 저장하면 두 파일간에 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에 버그가 있습니다. 당신의 코드에서

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() 메소드에 그 개체를 전달 : 해결 방법은 사용자 지정하여 XmlTextWriter를 만드는 것입니다.

해결 방법에 대해 읽을 수있는 Microsoft support case (해결 방법을 설명하지만 코드는 제공하지 않음)입니다.

+0

+1이기 때문에 작동합니다. 그러나 이로 인해 내 HTML/XML이 펑키하고 읽기가 어려운 형식으로 포맷되었습니다. 또 다른 옵션으로,이 응답은 문서의 형식을 엉망으로 만들지 않고 작업했습니다 : http://stackoverflow.com/a/16451790/279516. –