#c# #json #xml #oop
#c# #json #xml #ооп
Вопрос:
У меня есть программа, которая в какой-то момент загрузит текстовый файл. Содержимое этого текстового файла будет либо в формате xml, json, либо html.
Мой текущий подход выглядит следующим образом:
- Загрузите файл, проанализируйте его, проверьте, json ли это,
Да: сохраните его в предопределенной строке,
Нет: - Загрузите файл, проанализируйте его, проверьте, xml ли это,
Да: сохраните его в предопределенном XML-документе,
Нет: - Загрузите файл, проанализируйте его, проверьте, 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>();