应该如何定义和解析XML?我初步想了一下,用如下的方式来定义菜单,其中name为显示的名字,class为菜单的事件监听程序的类名,description为注释。
<?xml version="1.0" encoding="UTF-8"?>
<menubar>
  <menu name="文件" class="" discription="" icon="">
    <submenu name="新建" class="" discription=""></submenu>
    <submenu name="关闭" class="" discription=""></submenu>
    <separator></separator>
    <submenu name="保存" class="" discription=""></submenu>
    <submenu name="另存为" class="" discription=""></submenu>
    <separator></separator>
    <submenu name="退出" class="" discription=""></submenu>
  </menu>
</menubar>
我现在有几个问题:
1:这样做可不可行?
2:定义的XML格式是否合理?
3:如何定义相关的DTD?
4:如何解析这个XML?
5:谁能够给一个DEMO(呵呵,想偷懒)
欢迎大家讨论~~~

解决方案 »

  1.   

    1、可行
    2、可以再添加一些其他的属性进去
    3、自己去看xml的书,好象.xsd比较好
    4、dom4j,jdom
    5、自己写比较好
      

  2.   

    建议直接实现Action接口,这样的话比较方便
      

  3.   

    还有人继续讨论这个问题吗?等待ing~~~~
      

  4.   

    起码我想到了这个东西可以这样做,只是没有多少经验,有些地方有些困惑,这样不算偷懒吧~~~回头想一下,谁学习java不是照着个把例子一点一点摸索的?
      

  5.   

    DOM4J解析最好,如果客户端里没有要求修改菜单的需求,即一旦程序启动后,不会要求增删菜单,那可以省略DTD,DTD的作用再于定义和约束XML的格式,也是修改XML的依据,实际操作时如果你的需求一旦涉及增删菜单,那你既要定义DTD,又要根据DTD操作XML,代码会相当麻烦,最好还是不要这样做。如果只是对XML做读取工作,那是可行的。
    但我不知道你这个代码是用于SWING还是SWT,据我所知,关于菜单部分的JAVA GUI的标准做法都不是由程序员自定义XML的。
      

  6.   

    已经有成熟的东西了,lz不必自己从头搞
    你看看xul或许对你有帮助,我看到过支持xul的swing程序,当然xul对web也支持
      

  7.   

    我是一个菜鸟,我这样做的目的是:如果系统的菜单需要更改时,把对系统代码的改动减少到最低~我试了一下,好像成功了,欢迎大家继续讨论
    <?xml version="1.0" encoding="UTF-8"?>
    <menubar>
     <menu name="文件">
      <submenu name="新建" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="新建文件" icon="images/newfile.ico"></submenu>
      <submenu name="打开" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
      <submenu name="关闭" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
      <separator></separator>
      <submenu name="保存" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
      <submenu name="另存为" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
      <separator></separator>
      <submenu name="退出" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
     </menu>
     <menu name="编辑">
      <submenu name="撤销" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
      <submenu name="重做" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
      <separator></separator>
      <submenu name="剪切" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
      <submenu name="复制" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
      <submenu name="粘贴" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
      <submenu name="删除" action="cn.edu.wust.myworkflow.workflow.gui.action.CreateNewFileListener" discription="" icon=""></submenu>
     </menu>
    </menubar>
      

  8.   

    这是解析XML的代码:非常乱,不知道有没有人能够帮忙优化优化,我 水平太滥了,希望大家多多指点~~
    private JMenuBar createMenuBar()
    {
      JMenuBar menuBar = new JMenuBar();
      try {
       Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("configs\\MenuBar.xml");
       Element root = doc.getDocumentElement();
       NodeList items = root.getElementsByTagName("menu");
       for(int i = 0; i < items.getLength(); i ++)
       {
         Node item = (Node)items.item(i);
         JMenu menu = new JMenu(item.getAttributes().getNamedItem("name").getTextContent());
         NodeList submenus = item.getChildNodes();
         for(int j = 0; j < submenus.getLength(); j ++)
         {
            Node submenu = (Node)submenus.item(j);
            if(submenu instanceof Element){
     if(submenu.getNodeName().trim().toUpperCase().equals("SEPARATOR"))
    {
       menu.addSeparator();
    }
    else
    {
      JMenuItem menuItem = new JMenuItem(submenu.getAttributes().getNamedItem("name").getTextContent());
       menuItem.addActionListener((ActionListener)Class.forName(submenu.getAttributes().getNamedItem("action").getTextContent()).newInstance());
       menu.add(menuItem);
    }
         }
       }
       menuBar.add(menu);
    }
    }catch (Exception e)
    {
      JOptionPane.showMessageDialog(this, e);
    }
    return menuBar;
    }
      

  9.   

    这就像一个框架一样,我只要指定菜单项和相应的ActionListener,这个菜单就会自动应用到程序中,是不是有点像适配器模式?只要拿来插上就可以用,欢迎讨论继续~~
      

  10.   

    用dom4j,xml解析完成后放到hashmap中
      

  11.   

    想法还是好的,其实一般的管理系统里很多东西都可以用这种模板机制,   包括一些数据库操作, 但menu的问题是很难实现完全的xml配置, 因为事件响应还要写很多代码.
    lz的代码比较乱.
      

  12.   

    隐约觉得Eclipse用的好像也是这样的做法,查了一下,果真如此:
    View Menus,Toolbars and ActionsIdentifier: org.eclipse.ui.viewActions
    Description: This extension point is used to add actions to the pulldown menu and toolbar for views registered by other plug-ins. Each view has a local pulldown menu normally activated by clicking on the top right triangle button. Other plug-ins can contribute submenus and actions to this menu. Plug-ins may also contribute actions to a view toolbar. View owners are first given a chance to populate these areas. Optional additions by other plug-ins are appended.An action's enablement and/or visibility can be defined using the elements enablement and visibility respectively. These two elements contain a boolean expression that is evaluated to determine the enablement and/or visibility. The syntax is the same for the enablement and visibility elements. Both contain only one boolean expression sub-element. In the simplest case, this will be an objectClass, objectState, pluginState, or systemProperty element. In the more complex case, the and, or, and not elements can be combined to form a boolean expression. Both the and, and or elements must contain 2 sub-elements. The not element must contain only 1 sub-element.