我有一个结构复杂的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
}
}
您可以使用复合模式
我不是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();
}
}