Olá… eu estou fazendo um xml que representa um menu…
E queria escrever o xml assim…
<?xml version="1.0" encoding="UTF-8"?>
<mainmenu>
<submenus>
<menu name="Cadastro" type="menu">
<submenus>
<menu name="Cliente" type="menu">
<submenus>
<menu name="Cadastrar" type="item" />
<menu name="Consultar" type="item" />
</submenus>
</menu>
<menu name="Empresa" type="menu">
<submenus>
<menu name="Cadastrar" type="item" />
<menu name="Consultar" type="item" />
</submenus>
</menu>
</submenus>
</menu>
<menu name="Servicos" type="menu">
<submenus>
<menu name="Cotacao" type="menu">
<submenus>
<menu name="Cadastrar" type="item" />
<menu name="Consultar" type="item" />
</submenus>
</menu>
<menu name="Ordem de Coleta" type="menu">
<submenus>
<menu name="Cadastrar" type="item" />
<menu name="Consultar" type="item" />
</submenus>
</menu>
</submenus>
</menu>
<menu name="Sair" type="item" />
</submenus>
</mainmenu>
Tentei parsea-lo assim:
DocumentBuilderFactory factory = DocumentBuilderFactoryImpl
.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document doc = db.parse(file);
JFrame frame = new JFrame();
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
Element elem = doc.getDocumentElement();
NodeList nl = elem.getElementsByTagName("submenus");
for (int i = 0; i < nl.getLength(); i++) {
Element element = (Element) nl.item(i);
String type = element.getAttribute("type");
if (type.equals("menu")) {
JMenu menu = new JMenu(element.getAttribute("name"));
NodeList snl = element.getElementsByTagName("submenus");
for (int j = 0; j < snl.getLength(); j++) {
Element el = (Element) snl.item(j);
JMenuItem menuItem = new JMenuItem(el.getAttribute("name"));
menu.add(menuItem);
}
menuBar.add(menu);
} else if (type.equals("item")) {
JMenuItem menuItem = new JMenuItem(element.getAttribute("name"));
menuBar.add(menuItem);
}
}
frame.pack();
frame.setVisible(true);
Mas ele pega todos as tags submenus e eu queria só as que tivessem dentro da tag mainmenu e as outras eu vou parseando de acordo com os menus.
Eu tentei usar o XStream…
Ele funciona… o problema é o que ele gera:
<br.mf.menu.MainMenu>
<menus>
<br.mf.menu.Menu>
<name>Cadastro</name>
<submenus>
<br.mf.menu.Menu>
<name>Cliente</name>
<submenus>
<br.mf.menu.Menu>
<name>Cadastrar</name>
<submenus/>
<type>item</type>
</br.mf.menu.Menu>
<br.mf.menu.Menu>
<name>Cadastrar</name>
<submenus/>
<type>item</type>
</br.mf.menu.Menu>
</submenus>
<type>menu</type>
</br.mf.menu.Menu>
<br.mf.menu.Menu>
<name>Empresa</name>
<submenus>
<br.mf.menu.Menu>
<name>Cadastrar</name>
<submenus/>
<type>item</type>
</br.mf.menu.Menu>
<br.mf.menu.Menu reference="../br.mf.menu.Menu"/>
</submenus>
<type>menu</type>
</br.mf.menu.Menu>
</submenus>
<type>menu</type>
</br.mf.menu.Menu>
<br.mf.menu.Menu>
<name>Servicos</name>
<submenus>
<br.mf.menu.Menu>
<name>Cotacao</name>
<submenus>
<br.mf.menu.Menu>
<name>Cadastrar</name>
<submenus/>
<type>item</type>
</br.mf.menu.Menu>
<br.mf.menu.Menu>
<name>Cadastrar</name>
<submenus/>
<type>item</type>
</br.mf.menu.Menu>
</submenus>
<type>menu</type>
</br.mf.menu.Menu>
<br.mf.menu.Menu>
<name>Ordem de Coleta</name>
<submenus>
<br.mf.menu.Menu>
<name>Cadastrar</name>
<submenus/>
<type>item</type>
</br.mf.menu.Menu>
<br.mf.menu.Menu reference="../br.mf.menu.Menu"/>
</submenus>
<type>menu</type>
</br.mf.menu.Menu>
</submenus>
<type>menu</type>
</br.mf.menu.Menu>
<br.mf.menu.Menu>
<name>Sair</name>
<submenus/>
<type>item</type>
</br.mf.menu.Menu>
</menus>
</br.mf.menu.MainMenu>
O Usuario final vai escrever isso na mão e dessa forma não parece interessante… já trabalhei com xml e sei quanto é chato ficar fazendo isso.
Então… tem como eu parsear o XML que nem mostrei em cima?