2016-12-07 3 views
0

Я пытаюсь загрузить содержимое xml с помощью XmlTextReader, но по какой-то причине XmlTextReader игнорирует флаг DtdProcessing при обработке Xml. Флаг DtdProcessing работает нормально, если вместо этого я использую XmlReader. Проблема с XmlReader заключается в том, что она автоматически нормализует \ r \ n \ to \ n, что я не хочу в своей выходной строке.XmlTextReader игнорирует флаг DtdProcessing

Вот мой фрагмент кода:

XmlDocument xmlDocument = new XmlDocument(); 

string contents = @"<?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?> 
    <!DOCTYPE content [<!ENTITY ouml '&#246;'>]> 
    <content>Test &ouml; Test 

    Test</content>"; 

byte[] byteArray = Encoding.UTF8.GetBytes(contents); 
MemoryStream stream = new MemoryStream(byteArray); 

//XmlReaderSettings settings = new XmlReaderSettings(); 
//settings.DtdProcessing = DtdProcessing.Parse; 
//settings.IgnoreWhitespace = false; 
//XmlReader reader = XmlReader.Create(stream, settings); 
//xmlDocument.Load(reader); 

XmlTextReader reader = new XmlTextReader(stream); 
reader.DtdProcessing = DtdProcessing.Parse; 
xmlDocument.Load(reader); 

Console.WriteLine(xmlDocument.OuterXml); 

выхода я получаю от выше обработок:

"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"?><!DOCTYPE content[<!ENTITY ouml '&#246;'>]><content>Test &ouml; Test\r\n\r\n Test</content>" 

Вместо этого я хочу вывод строки с DTD переработанным:

"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"?><!DOCTYPE content[<!ENTITY ouml '&#246;'>]><content>Test ö Test\r\n\r\n Test</content>" 
+0

Почему вам небезразлично, как выглядит сериализованный XML? Нет никакой разницы между буквальными 'ö' и' ö ', если определен' ouml'. – Tomalak

+0

Спасибо, Томалак. Я хочу, чтобы буквально 'ö' в моем выводе вместо' ö '. Я ценю любой указатель. –

+0

Я понимаю, чего вы хотите. Я спрашивал * почему *, потому что два варианта эквивалентны. – Tomalak

ответ

0

код будет выглядеть примерно так

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 
using System.Xml; 
using System.Xml.Linq; 
using System.IO; 


namespace ConsoleApplication31 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XmlDocument xmlDocument = new XmlDocument(); 
      try 
      { 
       string contents = @"<?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?> 
       <!DOCTYPE content [<!ENTITY ouml '&#246;'>]> 
       <content>Test &ouml; Test 
       Test</content>"; 

       MemoryStream stream = new MemoryStream(); 
       XmlTextWriter writer = new XmlTextWriter(stream, Encoding.GetEncoding("ISO-8859-1")); 
       writer.WriteString(contents); 
       writer.Flush(); 

       byte[] bytes = new byte[stream.Length]; 
       stream.Position = 0; 
       stream.Read(bytes, 0, (int)stream.Length); 
       Console.WriteLine(Encoding.GetEncoding("ISO-8859-1").GetString(bytes)); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 



     } 
    } 

}