XML子树中属于父级的属性

时间:2010-06-16 19:11:30

标签: java xml oop separation-of-concerns

说我有这个XML

<doc:document>
  <objects>
    <circle radius="10" doc:colour="red" />
    <circle radius="20" doc:colour="blue" />
  </objects>
</doc:document>

这是解析它的方式(伪代码):

// class DocumentParser
public Document parse(Element edoc) {
     doc = new Document();
     doc.objects = ObjectsParser.parse(edoc.getChild("objects"));

     for ( ...?... ) {
         doc.objectColours.put(object, colour);
     }

     return doc;
}

ObjectsParser负责解析对象位,但不是也不应该知道文档的存在。但是,Document颜色通过使用Map与对象相关联。

您建议使用哪种模式将颜色设置从DocumentParser.parse返回ObjectsParser.parse,以便它可以将其与地图中的对象相关联?

替代方案将是这样的:

<doc:document>
  <objects>
    <circle id="1938" radius="10" />
    <circle id="6398" radius="20" />
  </objects>
  <doc:objectViewSettings>
   <doc:objectViewSetting object="1938" colour="red" />
   <doc:objectViewSetting object="6398" colour="blue" />
  </doc:objectViewSettings>
</doc:document>

难看!

2 个答案:

答案 0 :(得分:0)

有什么问题
for (ObjType obj : doc.objects)
{
    doc.objectColours.put(obj, obj.getColour())
}

这假定

  1. ObjectsParser返回一个 集合实例实现 可迭代
  2. ObjType是 可用作哈希键(实现 正确地使用equals()和hashCode())

答案 1 :(得分:0)

这是我自己的想法:

interface ObjectCreatedFromXmlCallback {
     created(Object object, Element source);
}

// class DocumentParser
public Document parse(Element edoc) {
     doc = new Document();
     doc.objects = ObjectsParser.parse(edoc.getChild("objects"), new ObjectCreatedFromXmlCallback() {
      created(Object o, Element s) {
       if (o instanceof Circle) {
        // read the colour property from s
        doc.objectColours.put(o, colour);
       }
      }
     });

     return doc;
}

// ObjectsParser.parse
c = new Circle();
c.radius = ecircle.getAttribute(...);
callback.created(c, ecircle);