2010-06-16 61 views
0

說我有這個XML屬性的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與對象關聯。

你會推薦什麼樣的圖案將顏色設置從ObjectsParser.parse重新設置爲DocumentParser.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> 

難看!

回答

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); 
0

這有什麼錯

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

這是假設

  1. ObjectsParser返回 集合實例實施 可迭代
  2. OBJTYPE是 可用作哈希鍵(實現 的equals()和hashCode ()正確)
+0

由於可以通過在顏色屬性的名稱空間前綴「文檔」中可以看出,它僅適用於文檔內容。由ObjectsParser創建的對象將不包含此屬性。 – 2010-06-16 21:46:35

+0

沒有ObjectsParser的描述,我們很難讀懂你的想法。在這種情況下,回調看起來像是最好的解決方案,因爲您需要在解析期間獲得控制權。 – 2010-06-16 22:02:18