2015-12-28 3 views
2

У меня есть XML-лист, который содержит некоторый специальный символ «& это спецвыпуски характер вызывает» и я использую ниже код для десериализации XMLXML десериализации со специальными символами в C# XMLSerializer

  XMLDATAMODEL imported_data; 

      // Create an instance of the XmlSerializer specifying type and namespace. 
      XmlSerializer serializer = new XmlSerializer(typeof(XMLDATAMODEL)); 

      // A FileStream is needed to read the XML document. 
      FileStream fs = new FileStream(path, FileMode.Open); 
      XmlReader reader = XmlReader.Create(fs); 


      // Use the Deserialize method to restore the object's state. 
      imported_data = (XMLDATAMODEL)serializer.Deserialize(reader); 
      fs.Close(); 

и structre моего XML Типовой, как это

[XmlRoot(ElementName = "XMLDATAMODEL")] 
    public class XMLDATAMODEL 
    { 
     [XmlElement(ElementName = "EventName")] 
     public string EventName { get; set; } 
     [XmlElement(ElementName = "Location")] 
     public string Location { get; set; } 
    } 

я попробовал этот код, а также с указанным Encoding, но без успеха

  // Declare an object variable of the type to be deserialized. 

      StreamReader streamReader = new StreamReader(path, System.Text.Encoding.UTF8, true); 
      XmlSerializer serializer = new XmlSerializer(typeof(XMLDATAMODEL)); 
      imported_data = (XMLDATAMODEL)serializer.Deserialize(streamReader); 
      streamReader.Close(); 

Оба подхода потерпели неудачу, и если я добавлю специальный символ внутри Cdata, он выглядит работающим. Как я могу заставить его работать с данными xml без CData?

Вот мое содержимое файла XML

http://pastebin.com/Cy7icrgS

И ошибка я получаю Существует ошибка в документе XML (2, 17).

+0

Какой особый символ заставляет его потерпеть неудачу? Например, '<' во внутреннем тексте? – Ian

+0

NO & вызывает проблемы –

+1

Вы должны быть сущ. Кодировкой амперсандов в исходных данных. –

ответ

4

Лучший ответ я мог бы получить afterlookingaround есть, если вы не сериализовать данные самостоятельно, это будет очень неприятности некоторые десериализовать XML Волю специальные символы.

В вашем случае, так как специальный символ &, прежде чем десериализации его, вы должны преобразовать его в &amp; Если персонаж & не преобразуется в &amp; мы не можем десериализации его с XmlSerializer. Да, мы все еще можем прочитать его, используя

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.CheckCharacters = false; //not to check false character, this setting can be set. 
FileStream fs = new FileStream(xmlfolder + "\\xmltest.xml", FileMode.Open); 
XmlReader reader = XmlReader.Create(fs, settings); 

Но мы не можем десериализовать его.

Как конвертировать & в &amp;, существуют различные способы с плюсом и минусом. Но нижняя строка во всех преобразованиях, , не использует поток напрямую. Просто возьмите данные из файла и преобразуйте его в string, используя, например, File.ReadAllText и начните обработку строк. После этого convert it - MemoryStream и начните десерилизацию;

И теперь для обработки струн перед десериализацией существует несколько способов сделать это.

Проще всего, и большую часть времени может быть самым небезопасным, можно было бы использовать string.Replace("&", "&amp;").

Другим способом, более твердым, но безопасным, является использование Regex. Так как ваш случай - это что-то внутри CData, это тоже может быть хорошим.

Еще один способ сложнее, но безопаснее, создавая разбор строки за строкой.

Мне еще предстоит найти общий, безопасный способ для этого преобразования.

Но что касается вашего примера, то будет работать string.Replace.Кроме того, вы можете использовать шаблон (что-то внутри CData) для использования Regex. Это тоже может быть хорошим.

Edit:

Что касается того, рассматриваются как специальные символы в XML и как обрабатывать их, прежде чем руки, согласно this, нелатинские символы включены.

Помимо нелатинских символов, в here, есть 5 специальные символов, перечисленные:

< -> &lt; 
> -> &gt; 
" -> &quot; 
' -> &apos; 
& -> &amp; 

И от here, мы получаем еще одно:

% -> &#37; 

Надежда они могут помочь вам !

+0

Я очень ценю усилия, чтобы объяснить это решение. Теперь я подозреваю, что столкнусь с той же проблемой с некоторыми другими специальными персонажами. Есть ли другие специальные символы, о которых нам нужно позаботиться? –

+0

Я не могу гарантировать, что знаю полный список специальных персонажей, так как сам никогда не сталкивался с такой проблемой. Somemore, согласно http://stackoverflow.com/questions/4899872/fast-way-to-deserialize-xml-with-special-characters, даже не-римские алфавиты являются специальными символами! Но помимо них вы можете взглянуть на это http://weblogs.sqlteam.com/mladenp/archive/2008/10/21/Different-ways-how-to-escape-an-XML-string-in- C.aspx есть как минимум 5 специальных символов: <, >, ',', &. Посмотрите на статью, чтобы узнать, как убежать от каждого из них. – Ian

+0

И посмотрите на это: https: // technet. microsoft.com/en-us/library/ms145315%28v=sql.90%29.aspx есть еще одно:% – Ian

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