Как создать общий тип, который может быть xml, json или html

#c# #json #xml #oop

#c# #json #xml #ооп

Вопрос:

У меня есть программа, которая в какой-то момент загрузит текстовый файл. Содержимое этого текстового файла будет либо в формате xml, json, либо html.

Мой текущий подход выглядит следующим образом:

  1. Загрузите файл, проанализируйте его, проверьте, json ли это,
    Да: сохраните его в предопределенной строке,
    Нет:
  2. Загрузите файл, проанализируйте его, проверьте, xml ли это,
    Да: сохраните его в предопределенном XML-документе,
    Нет:
  3. Загрузите файл, проанализируйте его, проверьте, html ли это,
    Да: сохраните его в предопределенном HTMLDocument,
    Нет: Ошибка

И, в конце концов, мне нужно различать. Проверьте их все. И то, что не равно null, будет обработано дополнительно.

Также мне пришлось создать экземпляр XML-документа и HTMLDocument следующим образом:

 XmlDocument XmlDoc = new XmlDocument();
XmlDoc = null;,
  

чтобы убедиться, что они на самом деле равны нулю при различении в конце. Потому что, если я только создам, они не будут равны null.

Это выглядит очень грязно. Я знаю, что могу что-то сделать с интерфейсами и, возможно, фабрикой. Но что меня смущает: допустим, я создаю IDocument интерфейса, разве содержимое этой вещи не должно быть универсальным? Я имею в виду, что у меня разные типы файлов.. Я очень смущен.

Комментарии:

1. Это зависит от обработки, которая выполняется на каждом из этих разных входных данных. Отличается ли ваша обработка json от xml? Возможно, код обработки следует объединить с шагами проверки типа и синтаксического анализа, тогда ваш интерфейс будет предоставлять обработанные файлы, а не необработанный файл

2. Просто мысль о вашем контенте. Все содержимое файлов является просто строкой, если только оно не сериализовано в двоичном формате. Итак, извлеките содержимое файла, попробуйте проанализировать его как различные типы. таким образом, вы загружаете файл только один раз, но пытаетесь проанализировать несколько раз 🙂

3. Да, это другое. Я выполняю одно и то же действие над ними (обновляю значение в зависимости от xpath / jsonpath. Логика в значительной степени та же, но oviobviously способ, которым я манипулирую каждым, отличается.

4. Мне интересно, есть ли у вас возможность изменить вашу программу, чтобы она принимала файлы .xml, .json, .html вместо простого .text файла? С этим может быть проще справиться, чем разрешить загрузку txt-файла, который содержит эти разные форматы.

5. Можете ли вы использовать MIME-тип, чтобы определить, какой тип файла загружается? Если это так, я бы создал фабрику, которая использует MIME-тип для выбора соответствующего класса для загрузки данных и манипулирования ими. Итак, 4 класса. 1 для синтаксического анализа / манипулирования каждым типом файла 1 factory.

Ответ №1:

Ну, вы все равно должны проверять наличие этих 3 типов, но, однако, вы можете создать свой собственный класс и реализовать эти проверки и синтаксический анализ внутри вашего собственного класса (или интерфейса):

Вы можете создать неявное приведение для всех трех типов, чтобы вы могли установить его значение с любым из этих 3 типов:

 public class MultiDoc
{
     private XmlDocument xml = new XmlDocument();
     private string type = "";
     public void Load(string content)
     {
          //do your checking to match the types here
     }

     public T Get<T>()
     {
          if(typeof(T) == typeof(XmlDocument))
              return xml;
          elseif ...
     }

     //implicit casting type XmlDocument
     public MultiDoc(XmlDocument input) {  xml = input; type = "xml"; }
     public static implicit operator MultiDoc(XmlDocument input) { return new MultiDoc(input); }

    //do same casting for other types.

}
  

Теперь из-за неявного приведения вы можете просто сделать:

 XmlDocument somexml = ....
MultiDoc mc = somexml;  //implicity cast XmlDocument to MultiDoc 
  

И для получения:

 XmlDocument somexml = mc.Get<XmlDocument>();