2015-09-08 83 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中)准备就绪后,我想要开始整个对象图的初始化。一旦初始化完成,我只想使用IXmlSerializable接口编写XML。是否有任何设计模式用于我正在使用的对象初始化类型?目前,我只是在做以下事情。这看起来很奇怪。

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模式

我不是一个C#开发人员,但您可以为您的每个标签类型,并从XMLTag继承来聚集XMLTag对象CompositeXMLTag的XMLTag类。

然后你创建标签树

的初始化类有关复合模式的更多信息http://www.codeproject.com/Articles/185797/Composite-Design-Pattern

编辑:我不是一个C#开发人员,所以这里是一个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

我认为你可以在你有的每个标签中插入子标签,如果是这种情况,你只会有复合类,而不是叶子。 如果例如SubTag1_1和SubTag1_2不接受孩子,他们将是叶类。 –