2015-09-08 5 views
0

У меня есть XML-файл со сложной структурой. Ниже приводится лишь небольшая выборка.Создание цепочки цепочек объектов

<MainTag> 
     <Tag1 name=""> 
      <SubTag1_1 msgType=""> 
      <SubTag1_2 storeId="abc" abc=""/> 
      </Tag1> 
      <Tag2 msgType=""> 
       <SubTag2_1 name="" cap="" value="#"/> 
       <SubTag2_2=""/> 
      </Tag2> 
     </Tag1> 

     <Tag3 name=""> 
      <SubTag3> 
       <SubTag3_1 msgType="A" value="1"> 
        <SubSubTag3 name="" xml="" sap="" time_delta="0" time_absolute="2"/> 
        <SubSubTag3 name="" xml="" sap="" type="transmit" time_delta="5" time_absolute="2"/> 
       </SubTag3_1 > 
       <SubTag3_2 msgType="" value="1"> 
        <SubSubTag3 name="" xml="" sap="" type="receive" time_delta="0" time_absolute="2"/> 
      </SubTag3_2> 
     </SubTag3> 
    </Tag3> 
</MainTag> 

Мне нужно создать вышеуказанный XML-файл несколько раз для разных наборов данных. Вместо того, чтобы иметь один класс, чтобы взять все данные и написать XML-файл, я создал своего рода граф объектов. Каждый основной тег представлен классом. Например,

Класс MainTag будет иметь ссылку на классы Tag1 и Tag3. Класс Tag1 будет иметь ссылку на подкласс SubTag1, Tag2 и т. Д. Кроме того, каждый класс реализует интерфейс IXmlSerializable, который делает запись XML-файла довольно простой и красивой. Разделение классов также помогает, если структура XML изменяется.

Вопросы:

1) Является ли подход правильно разделить структуру XML в набор классов?

2) Поскольку у меня много классов, я должен инициализировать всю структуру класса (графа объектов). Когда данные (которые я хочу вставить в xml) готовы, я хочу начать инициализацию всего графа объектов. После инициализации я просто хочу написать XML, используя интерфейс IXmlSerializable. Есть ли какой-либо шаблон проектирования для типа инициализации объекта, который я использую? В настоящее время я просто делаю следующее. Это выглядит странно.

class MainTag: XmlBase 
{ 
    List<Tag1> Tag1List{ get; set; } 
    Tag1 t; 

    public MainTag() : base() 
    { 
     t = new Tag1(); 
     //Do processing and populate the properties of MainTag 
    } 
} 

class Tag1 : XmlBase 
{ 
    List<SubTag1_1> subtags; 
    SubTag1_1 s; 

    public Tag1() 
    { 
     s = new SubTag1_1(); 
     //Do processing and populate the properties of Tag1 
    } 
} 

ответ

0

Вы можете использовать Composite Pattern

Я не с # разработчиком, но вы можете создать класс XMLTag для каждого типа тега вы имеете и CompositeXMLTag, который наследуется от XMLTag агрегировать объекты XMLTag.

Затем вы создаете класс для инициализации метки дерева

Для получения дополнительной информации о композитном рисунке http://www.codeproject.com/Articles/185797/Composite-Design-Pattern

EDIT: Я не с # разработчиком, так вот пример Java

public interface CompositeXMLTag { 

    public void addTag(CompositeXMLTag tag); 

    public void serialize(); 
} 



public class Tag1 implements CompositeXMLTag { 

    private List<CompositeXMLTag> tags = new ArrayList<CompositeXMLTag>(); 
    private String name; 

    /* getters and setters */ 

    @Override 
    public void addTag(CompositeXMLTag tag) { 
     this.tags.add(tag); 
    } 

    @Override 
    public void serialize() { 
     for (CompositeXMLTag compositeXMLTag : tags) { 
      compositeXMLTag.serialize(); 
     } 
    } 
} 

public class SubTag1_1 implements CompositeXMLTag{ 

    private List<CompositeXMLTag> tags = new ArrayList<CompositeXMLTag>(); 
    private String storeId; 
    private String abc; 

    /* getters and setters */ 

    @Override 
    public void addTag(CompositeXMLTag tag) { 
     this.tags.add(tag); 
    } 

    @Override 
    public void serialize() { 
     for (CompositeXMLTag compositeXMLTag : tags) { 
      compositeXMLTag.serialize(); 
     } 
    } 
} 

public class Client { 

      public static void main(String[] args) { 
       CompositeXMLTag tag1 = new Tag1(); 

       tag1.addTag(new SubTag1_1()); 

       tag1.serialize(); 
      } 

     } 
+0

Не является составным рисунком для отношений между объектами? –

+0

Вы предлагаете, что для каждого XMLTag я создаю класс. Затем создайте другой класс, который будет действовать как родительский, называемый CompositeXMLTag. Но в соответствии с композитным рисунком, какой класс будет действовать как лист? –

+0

Я предполагаю, что вы можете вставлять subtags в каждый тэг, который у вас есть, если это так, у вас будут только составные классы, а не листья. Если, например, SubTag1_1 и SubTag1_2 не принимают дочерние элементы, они будут классами листа. –

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