2010-05-22 6 views
1

Так что я сейчас работаю над приложением для чтения электронных книг, и я просто просматриваю кучу обычных XML-файлов, просто отлично с System.Xml и XmlDocument:503 (Server Unavailable) WebException при загрузке локального файла XHTML

XmlDocument xmldoc = new XmlDocument(); 
xmldoc.Load(Path.Combine(Directory.GetCurrentDirectory(), "META-INF/container.xml")); 
XmlNodeList xnl = xmldoc.GetElementsByTagName("rootfile"); 

Однако теперь я пытаюсь открыть файлы XHTML, содержащие фактический текст книги, и они являются файлами XHTML. Теперь я не знаю разницу между этими двумя, но я получаю следующее сообщение об ошибке с этим кодом (в том же документе, используя один и тот же XmlDocument и переменную XmlNodeList)

xmldoc.Load(Path.Combine(Directory.GetCurrentDirectory(), "OEBPS/part1.xhtml")); 

«WebException было необработанное: Удаленный сервер возвратил ошибку: (503) Сервер недоступен «

Это локальный документ, поэтому я не понимаю, почему он дает эту ошибку? Любая помощь будет принята с благодарностью. :)

У меня есть полный исходный код здесь, если это помогает: http://drop.io/epubtest

(я знаю, что метод ePubConstructor.ParseDocument() ужасно грязный, я просто пытаюсь получить его работу в тот момент, прежде чем я разделить это в классы)

ответ

0

Попробуйте следующий непроверенный код:

XmlDocument xmldoc = new XmlDocument(); 
XmlReaderSettings settings = new XmlReaderSettings 
{ 
    XmlResolver = new XmlUrlResolver() 
}; 
using (var reader = XmlReader.Create(
    Path.Combine(Directory.GetCurrentDirectory(), 
       "OEBPS/part1.xhtml"), settings)) 
{ 
    xmlDoc.Load(reader); 
} 
+0

Спасибо! Я также нашел другое предложение из вашего кода, что я могу сделать только «xmldoc.XmlResolver = null;», и это тоже работает. Я не уверен, что предпочтительнее другого, но ваш код был очень полезен! (плюс вы дали мне подсказку использования (var ...), которая поможет мне очистить мой код совсем немного) – kcoppock

2

Попробуйте удалить DOCTYPE из файла XHTML, возможно, у вас есть ссылка на внешний DTD.

+0

Благодарим за отзыв! Это действительно работает, однако цель программы - взять эти существующие файлы и прочитать их, поэтому я не смогу вручную удалить строку DOCTYPE из каждого файла. Есть ли способ, в который я могу втянуть его, и игнорировать этот тег? – kcoppock

0

Попробуйте следующий код:

XmlDocument xmldoc = новый XmlDocument();

doc.XmlResolver = null; // это игнорирует DTD

xmldoc.Load (Path.Combine (Directory.GetCurrentDirectory(), "META-INF/container.xml"));

XmlNodeList xnl = xmldoc.GetElementsByTagName ("rootfile");