2010-05-24 2 views
1

Хорошо, так что это своего рода хак ... но, возможно, это должно быть. Я пишу приложение в XNA, которое из моих исследований по этой проблеме, по-видимому, не поддерживает XML-версию 1.1. Я читаю содержимое документа ePub, и одна из новых книг кодирует его содержимое как XML-документ версии 1.1. Это приводит к сбою моей программы, однако структура такая же, как и остальная. Единственное, что удерживает его от работы, это жестко закодированное «1.0» в классе XmlDocument.Заменить слово в XML-файле через StreamReader в XNA?

Возможно ли, что я мог прочитать в файле из потока, увидеть, если он содержит:

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

и просто заменить его на «1.0»? Тогда я мог бы взять его как XmlDocument. Я не делаю никаких записей в файле или каких-либо сложных структурных чтений, просто ищу некоторые узлы и вытягивая значения, поэтому я не знаю, какими будут последствия этого.

+0

Почему бы просто не сделать это с помощью текстового редактора или заменить его с помощью регулярного выражения? –

+0

Я действительно только что узнал о Regex сегодня, но я еще не знаю, как его использовать. Что касается того, почему бы не заменить его вручную, приложение автоматически вытащит эти XML-файлы из архива ePub, поэтому его замена вручную не является вариантом. – kcoppock

ответ

2

Вы можете сделать это в очень хитроумный способ, читая весь файл XML в памяти и иметь свой путь с ним:

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.1 в строке 1, char 16 (там, где она выдает исключение), а если это так, тогда запустите этот процессор на нем. Это определенно изворотливый способ сделать это, я буду уверен, что не могу найти другого пути, прежде чем заниматься этим, ха-ха. Спасибо за помощь! – kcoppock

Смежные вопросы