Лучший способ построить XML из XElements, где много элементов совместно используются? - PullRequest
1 голос
/ 05 февраля 2012

Примечание: я прочитал это , и это не совсем то, что я ищу:

У меня есть приложение, которое создает XML из вводафайл и создает один из двух выходных данных, в зависимости от выбранного файла.Это было «быстрое грязное» приложение, чтобы обойти насущную проблему, но я знаю, что оно найдет дальнейшее применение и хочу упредить это путем рефакторинга.

На данный момент у меня есть «строитель»класс, который принимает входные данные (в своем ctor) и предоставляет свойство, которое является обязательным XElement.Тем не менее, многие из XElements идентичны, за исключением содержимого, для обоих моих выводов XML.(О, пожалуйста, не обращайте внимания на часть проверки, которую я реорганизую отдельно)

Так что я смотрю на разумный способ СУШКИ моего приложения:

На данный момент у меня есть что-то вроде этого.

public FirstBuilder(string line, int lineNumber, bool output, string subjectType, string inquiryCode)
{
    var split = Regex.Split(line, @"\|");
    if (split.Count() != SPLIT_COUNT)
        throw new Exception("This does not appear to be a valid First Type input file.");

    _lineNumber = lineNumber;
    _reportId = output ? TXT_REPORT_ID : XML_REPORT_ID;
    _subjectType = subjectType;
    _responseType = output ? TXT_RESPONSE_TYPE : XML_REPONSE_TYPE;
    _inquiryCode = inquiryCode;

    _product = split[0];
    _number = split[1];
    _amount = split[2];
    _currency = split[3];
    _name = split[4];
    _nationalId = split[5];
    _gender = split[6];
    _dateOfBirth = split[7];
    _nationality = split[8];
}

public XElement RequestElement
{
    get
    {
        return new XElement("REQUEST",
            new XAttribute("REQUEST_ID", _lineNumber),
            RequestParametersElement,
            SearchParametersElement);
    }
}

private XElement RequestParametersElement
{
    get
    {
        return new XElement("REQUEST_PARAMETERS",
            ReportParametersElement,
            InquiryPurposeElement,
            ApplicationElement);
    }
}

private XElement ReportParametersElement
{
    get
    {
        return new XElement("REPORT_PARAMETERS",
            new XAttribute("REPORT_ID", _reportId),
            new XAttribute("SUBJECT_TYPE", _subjectType),
            new XAttribute("RESPONSE_TYPE", _responseType));
    }
}

etc. etc...

//used by
var x = new FirstBuilder(x,y,z,etc.).RequestElement();

Все это работает и очень быстро ... но SecondBuilder также использует те же самые элементы, наряду с некоторыми другими.

Так что я смотрю на "лучшие"способ их реорганизовать: общий класс Abstract с наследованием?Общие "вспомогательные" занятия?Методы расширения для возврата «встроенных» элементов?Классы на элемент, которые расширяют XElement?

Я подозреваю, что из двух примеров это быстро вырастет до 30 в следующем месяце!

THX.

1 Ответ

0 голосов
/ 05 февраля 2012

Я бы реорганизовал частные свойства в методы, которые получают требуемые значения в качестве входных параметров. Затем вы можете переместить их в класс PartsBuilder и использовать его в своих конкретных строителях.

...