当前位置: 代码迷 >> XML/SOAP >> 这种需求用XML的继承机制是否可以解决解决思路
  详细解决方案

这种需求用XML的继承机制是否可以解决解决思路

热度:334   发布时间:2012-02-22 19:36:55.0
这种需求用XML的继承机制是否可以解决
之所以想要问这个问题,是因为我再具体的项目中遇到这样一个情况.
前一阵我被分配一个任务开发一批JSP Tag对一个JavaScript绘图库进行
封装,因为大家对JS都不是很熟悉。开发并不难,很快就把基类搞出来
了,其子类用来完成具体图表的绘制。但当我为写好的JSP Tag写TLD文件
的时候发现写这些文本文件远远没有写Java文件那么轻松,即使这些子类
90%的定义基本相同,你也必须一个个的去手写,比如像下面这样:
XML code
<tag>
     <name>BarChart</name>
     <tagclass>com.fhd.chart.BarChar</tagclass>
     <bodycontent>JSP</bodycontent>        
        
     <attribute>
     <name>label</name>
     <required>false</required>
     <rtexprvalue>true</rtexprvalue>
    </attribute>
    ...
</tag>
<tag>
     <name>LineChart</name>
     <tagclass>com.fhd.chart.BarChar</tagclass>
     <bodycontent>JSP</bodycontent>        
        
     <attribute>
     <name>label</name>
     <required>false</required>
     <rtexprvalue>true</rtexprvalue>
     </attribute>
     ...
</tag>
...


这些JSPTag的定义中有80%多是用来声明title width height backcolor这些通用属性的
当时我只是随便起的名字,然后复制粘贴,后来发现有些不合适需要调整,还需要一个
一个得修改,稍微漏下一个就会出错。想在我想问一下在xml中有没有类似的集成策略使我
能够很方便的处理这样的问题,比如我可以定义一个基类节点,然后其他节点只需集成下
就可拥有其基类下所有的子节点,就像下面这样:
XML code
<CommonChartSet>
    <bodycontent>JSP</bodycontent>    
     <attribute>
     <name>label</name>
     <required>false</required>
     <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
     <name>width</name>
     <required>false</required>
     <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
     <name>height</name>
     <required>false</required>
     <rtexprvalue>true</rtexprvalue>
     </attribute>
     ....
</CommonChartSet>

<tag extends="CommonChartSet">
    <name>LineChart</name>
    <tagclass>com.fhd.chart.LineChar</tagclass>
</tag>

<tag extends="CommonChartSet">
    <name>BarChart</name>
    <tagclass>com.fhd.chart.BarChar</tagclass>
</tag>
....

不知道大家明白我的意思没有。希望大家能给个思路或给些资料,当然最后是能给个HelloWorld

------解决方案--------------------
你想用模板方法生成tld的tag内容
------解决方案--------------------
tld的定义格式必须是这样的!不然不会符合sun的dtd
------解决方案--------------------
scheme中倒是有,complextype
------解决方案--------------------
没有这样的功能,这种功能显然是要解析器去做的。
其实你可以在你的解析器上加上解析extend属性的功能即可。
  相关解决方案