Атрибуты в поддереве XML, принадлежащие родительскому - PullRequest
0 голосов
/ 16 июня 2010

Скажем, у меня есть этот 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 голосов
/ 17 июня 2010

Вот моя идея:

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);
0 голосов
/ 17 июня 2010

Что не так с

for (ObjType obj : doc.objects)
{
    doc.objectColours.put(obj, obj.getColour())
}

Это предполагает

  1. ObjectsParser возвращает реализация экземпляра коллекции Iterable
  2. ObjType is можно использовать как ключ хеша (реализует равно () и hashCode () правильно
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...