2010-05-24 6 views
1

좋아요, 이것은 일종의 해킹입니다 ...하지만해야 할 수도 있습니다. XNA에서이 문제에 대한 연구에서 분명히 XML 버전 1.1을 지원하지 않는 앱을 ​​작성하고 있습니다. ePub 문서의 내용을 읽었으며 새로운 책 중 하나는 내용을 버전 1.1 XML 문서로 인코딩합니다. 이로 인해 내 프로그램이 중단되지만 구조는 나머지 프로그램과 동일합니다. 작동하지 않게하는 유일한 방법은 XmlDocument 클래스에서 하드 코딩 된 "1.0"입니다.XNA의 StreamReader를 통해 XML 파일의 단어를 바꾸시겠습니까?

<?xml version="1.1" encoding="UTF-8" standalone="no"?>

을 단순히 "1.0"로 대체 :

은 내가 스트림에서 파일에 읽기가 포함 된 경우 볼 수 수 있습니까? 그런 다음 XmlDocument로 가져올 수 있습니다. 파일에 대한 글이나 복잡한 구조적인 읽기 작업을 수행하지 않고 특정 노드를 찾고 값을 가져 오는 것이므로 어떤 영향이 있는지 알 수 없습니다.

를 메모리에 전체 XML 파일을 읽고 그것으로 당신의 방법을함으로써 매우 위태로운 방법으로이 작업을 수행 할 수 있습니다
+0

텍스트 편집기를 사용하거나 regex를 사용하여 바꾸지 않는 이유는 무엇입니까? –

+0

나는 실제로 Regex에 대해 지금 막 배웠다. 그러나 나는 아직 그것을 사용하는 방법에 익숙하지 않다. 수동으로 바꾸지 않는 한, 앱은 XML 파일을 ePub 보관함에서 자동으로 꺼내므로 수동으로 바꾸는 것은 실제로 선택 사항이 아닙니다. – kcoppock

답변

2

:

string content = ""; 

// Read the XML file into content 
StreamReader reader = new StreamReader("file.xml"); 
content = reader.ReadToEnd(); 
reader.Close(); 

// Find the character position just after the <?xml token, and just before the ?> token 
int openIndex = content.IndexOf("<?xml", StringComparison.OrdinalIgnoreCase) + 5; 
int closeIndex = content.IndexOf("?>", openIndex); 

// Get the bits between <?xml and ?>  
string header = content.Substring(openIndex, closeIndex - openIndex); 

// Substitute version string. 
header = header.Replace("version=\"1.1\"", "version=\"1.0\""); 

// Put Humpty Dumpty back together again. 
content = string.Concat(content.Substring(0, openIndex), header, content.Substring(closeIndex)); 

// Feed content into an XMLReader (or equivalent) here. 

그것은 당신이 제공하는 예를 들어 문자열을 작동하지만 내가 테스트하지 않았습니다 불완전한 형식의 XML 문서에서

+0

그들은 이론적으로 모두 완벽하게 형식화 된 XML 문서 여야합니다 ...하지만 그렇기 때문에 이론이라고합니다. :) 당신의 방법은 작동합니다. 나는 행 1, 문자 16 (예외를 던지는 곳)에서 1.1을 찾았는지 확인하기 만하면됩니다. 그렇다면이 프로세서를 실행하십시오. 그것은 분명히 그것을하는 dodgy 방법이다, 나는 이것과 같이되기 전에 다른 방법을 찾을 수 없다는 것을 확실히 할 것이다, 하하. 도와 주셔서 감사합니다! – kcoppock