JSON.Net: преобразование строки JSON из строки XML в проблему экземпляра - PullRequest
1 голос
/ 11 мая 2009

У меня есть следующая функция:

public static T GetInstance<T>(string xmlString)
{
   var xmlDoc = new XmlDocument();
   xmlDoc.Load(new StringReader(xmlString));
   string jsonString = JsonConvert.SerializeXmlNode(xmlDoc.DocumentElement);
   T instance = JsonConvert.DeserializeObject(jsonString, typeof(T)) as T;
   return instance;
}

Отлично работает для обычных строк XML. Однако, если входная строка XML содержит комментарии, такие как:

....
<!-- some comments ... 
-->
....

Тогда вызов функции JsonConvert.DeserializeObject () сгенерирует исключение:

Newtonsoft.Json.JsonSerializationException was unhandled
Message="Unexpected token when deserializing object: Comment"
Source="Newtonsoft.Json"
StackTrace:
   at Newtonsoft.Json.JsonSerializer.PopulateObject(Object newObject, JsonReader reader, Type objectType)
   ....

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

Для первого варианта, если мне нужно удалить все комментарии с помощью XmlDocument, есть ли какие-либо параметры в XmlDocument, доступные для преобразования строки XML в строку XML только для узлов?

Что касается второго варианта, я предпочитаю, если в Json.Net есть какая-либо опция, игнорирующая комментарии при десиализации объекта?

1 Ответ

3 голосов
/ 11 мая 2009

Я думаю, что лучший способ для меня сейчас - сначала удалить все узлы комментариев из строки xml.

public static string RemoveComments(
        string xmlString,
        int indention)
{
   XmlDocument xDoc = new XmlDocument();
   xDoc.PreserveWhitespace = false;
   xDoc.LoadXml(xmlString);
   XmlNodeList list = xDoc.SelectNodes("//comment()");

   foreach (XmlNode node in list)
   {
      node.ParentNode.RemoveChild(node);
   }

   string xml;
   using (StringWriter sw = new StringWriter())
   {
      using (XmlTextWriter xtw = new XmlTextWriter(sw))
      {
        if (indention > 0)
        {
          xtw.IndentChar = ' ';
          xtw.Indentation = indention;
          xtw.Formatting = System.Xml.Formatting.Indented;
        }

        xDoc.WriteContentTo(xtw);
        xtw.Close();
        sw.Close();
      }
      xml = sw.ToString();
    }

  return xml;
  }

И это моя функция для получения экземпляра из строки XML:

public static T GetInstance<T>(string xmlString)
{
  srring xml = RemoveComments(xmlString);
  var xmlDoc = new XmlDocument();
  xmlDoc.Load(new StringReader(xml));
  string jsonString = JsonConvert.SerializeXmlNode(xmlDoc.DocumentElement);
  T instance = JsonConvert.DeserializeObject(jsonString, typeof(T)) as T;
  return instance;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...