XML文件如下:
Menus.xml
<?xml version="1.0" encoding="utf-8" ?>
<Menus>
    <MyMenu code="10000" name="我的桌面" right="false">
        <ToolBar code="10100" name="首页" url="Index" />
        <ToolBar code="10200" name="个人考勤" url="KaoQin">
            <LeftMenu code="10201" name="每日考勤" url="Today" />
            <LeftMenu code="10202" name="请假申请" url="Today" />
        </ToolBar>
    </MyMenu>
    <MyMenu code="20000" name="人力资源" right="true">
        <ToolBar code="20100" name="首页" url="" right="false" />
        <ToolBar code="20200" name="人事管理" url="Employee" right="true">
            <LeftMenu code="20201" name="员工管理" url="Employee" right="true"></LeftMenu>
            <LeftMenu code="20202" name="部门管理" url="Department" right="true"></LeftMenu>
            <LeftMenu code="20203" name="职位管理" url="Position" right="true"></LeftMenu>
            <LeftMenu code="20204" name="角色管理" url="Role" right="true"></LeftMenu>
        </ToolBar>
     </MyMenu>
</Menus>想用java实现读取此XML,并把相应的值付给对象。
MyMenu.java
public class MyMenu {
public int code;
public String name;
public boolean right;
public List<ToolBar> children;        //getter 和setter方法略……
}ToolBar.java
public class ToolBar {
public int code;
public String name;
public String url;
public boolean right;
public List<LeftMenu> children;         //getter 和setter方法略……
}
LeftMenu.java
public class LeftMenu {
public int code;
public String name;
public String url;
public boolean right;
        //getter 和setter方法略……
}以前从来没有做过解析XML,今天从网上找了好多代码调试,发现都不太适用。望高人指点……谢谢了!

解决方案 »

  1.   

    有很多现成的例子的。上网搜搜xml的解析包。
      

  2.   

    XML解析网上例子有很多种,这里有详细说明
    http://www.it.com.cn/f/edu/053/27/93819.htm
    这里的xml都是取节点的属性值,然后放到对象里即可。主要还是看你用什么解析器,不同的解析器提供的方法都是不一样的。
      

  3.   

    <Menus> 
        <MyMenu code="10000" name="我的桌面" right="false"> 
    我用SAX方法,从API里找了好多方法都没找到怎么读取MyMenu里的code,name等等属性值的方法,可能是做法不对!public static List<MyMenu> AllMenu() throws ParserConfigurationException,   
        SAXException, IOException {
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory
    .newInstance();
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    /*
     * builder.parse()方法将给定文件的内容解析为一个 XML 文档, 并且返回一个新的 DOM Document对象。
     */
    Document document = builder.parse(new File("WebRoot\\Menus.xml"));
                    // 获取文档的根元素,赋值给rootElement变量
    Element rootElement = document.getDocumentElement();
                    NodeList childNodes = rootElement.getChildNodes();

    MyMenu myMenu = new MyMenu();

    for (int i = 0; i < childNodes.getLength(); i++) {
    // 获取childNodes的第i个节点
    Node childNode = childNodes.item(i);
    // 判断childNode是不是一个元素节点,并且它的 nodeName 值为book
    if (childNode.getNodeType() == Node.ELEMENT_NODE
    && childNode.getNodeName().equals("MyMenu")) {
                         myMenu.setCode(这里试了好多childNode.XXX方法都不行……);        
    应该写哪个方法才能获取code属性呢???
      

  4.   

    假设节点对象为   element那么获得节点对象属性:   element.attributeValue("属性名");获得节点对象文本值 :     element.getText();还有什么不明白的么?
      

  5.   

    XML一般两种解析方式:1种是全部读入内存形成dom树(dom方式),对待大文件xml解析时消耗内存比较大,不过查找,增删改节点比较方便,另一种是基于事件流(sax方式),每一个节点的开始,结尾,属性等均有事件处理接口,做访问者模式时很方便,且不会一次性读入内存现在还有两者结合的stax模式,BEA的开源包支持stax,dom方式jdom.jar包用得最多,sax方式的更多开源包,网上搜一下即可
      

  6.   

    顶一下,不太清楚,正在研究。java web刚起步
      

  7.   

    使用了你提供的配置文件import java.io.File;
    import java.io.IOException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;
    import org.jdom.xpath.XPath;//使用了jdom-1.0.jar
    public class ReadMyMenu
    {
        public static void main(String[] args) throws JDOMException, IOException
        {
            String filename = "mymenu.xml";
            String rootPath = "//Menus/MyMenu";        List<MyMenu> mymenus = new ArrayList<MyMenu>();
            List<ToolBar> toolBars = null;
            List<LeftMenu> leftMenus = null;        URL url = ReadMyMenu.class.getClassLoader().getResource(filename);
            File file = new File(url.getPath());        XPath xpath = null;
            SAXBuilder builder = new SAXBuilder();
            Document document = builder.build(file);        xpath = XPath.newInstance(rootPath);
            List<Element> elementsMenu = xpath.selectNodes(document);        MyMenu menu = null;
            ToolBar bar = null;
            LeftMenu left = null;        for (Element ele : elementsMenu)
            {
                menu = new MyMenu();
                menu.setCode(Integer.valueOf(ele.getAttributeValue("code")));
                menu.setName(ele.getAttributeValue("name"));
                menu.setRight(Boolean.valueOf(ele.getAttributeValue("right")));            List<Element> elementsBars = ele.getChildren("ToolBar");
                toolBars = new ArrayList<ToolBar>();
                for (Element eleBar : elementsBars)
                {
                    bar = new ToolBar();
                    bar.setCode(Integer.valueOf(eleBar.getAttributeValue("code")));
                    bar.setName(eleBar.getAttributeValue("name"));
                    bar.setUrl(eleBar.getAttributeValue("url"));
                    bar
                            .setRight(Boolean.valueOf(eleBar
                                    .getAttributeValue("right")));
                    List<Element> elementsLeft = eleBar.getChildren("LeftMenu");
                    leftMenus = new ArrayList<LeftMenu>();
                    for (Element eleLeft : elementsLeft)
                    {
                        left = new LeftMenu();
                        left.setCode(Integer.valueOf(eleLeft
                                .getAttributeValue("code")));
                        left.setName(eleLeft.getAttributeValue("name"));
                        left.setRight(Boolean.valueOf(eleLeft
                                .getAttributeValue("right")));
                        left.setUrl(eleLeft.getAttributeValue("url"));
                        leftMenus.add(left);
                    }
                    bar.setChildren(leftMenus);
                    toolBars.add(bar);
                }
                menu.setChildren(toolBars);
                mymenus.add(menu);
            }
        }
    }
      

  8.   

    我尝试用DOM进行解析,可始终有错误。
    哪位大师帮偶看一下,谢谢import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.StringReader;
    import java.util.ArrayList;
    import java.util.List;import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;
    import org.w3c.dom.NamedNodeMap;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    public class ParseMenu {
    public static void main(String[] args) throws Exception {
    //建立DOM对象
    InputSource is=null;
    DocumentBuilderFactory dbf=null;
    DocumentBuilder db=null;
    Document doc=null;

    try {
    is=new InputSource(new StringReader(readFromFile("Menus.xml")));
    dbf=DocumentBuilderFactory.newInstance();
    db=dbf.newDocumentBuilder();
    doc=db.parse(is);
    } catch (ParserConfigurationException pce) {
    throw pce;
    }catch(SAXException se){
    throw se;
    }catch(IOException ioe){
    throw ioe;
    }

    NodeList nodeList=null;
    NamedNodeMap namedNodeMap=null;
    String codeValue=null,nameValue=null,urlValue=null,rightValue=null;


    //MyMenu
    nodeList=doc.getElementsByTagName("MyMenu");
    List<MyMenu> myMenus=new ArrayList<MyMenu>();
    MyMenu myMenu=null;
    List<ToolBar> toolBarChildren=null;
    List<LeftMenu> leftMenuChildren=null;
    ToolBar toolBar=null;
    LeftMenu leftMenu=null;

    for (int i = 0; i < nodeList.getLength(); i++) {
    myMenu=new MyMenu();
    namedNodeMap=nodeList.item(i).getAttributes();
    codeValue=namedNodeMap.getNamedItem("code").getNodeValue();
    nameValue=namedNodeMap.getNamedItem("name").getNodeValue();
    if(namedNodeMap.getNamedItem("right")!=null) rightValue=namedNodeMap.getNamedItem("right").getNodeValue();
    myMenu.setCode(Integer.parseInt(codeValue));
    myMenu.setName(nameValue);

    if(rightValue!=null){
    if(rightValue.equals("true")) myMenu.setRight(true);
    else myMenu.setRight(false);
    }
    //判读ToolBar是否有子节点
    if(nodeList.item(i).hasChildNodes()){
    //ToolBar
    toolBarChildren=new ArrayList<ToolBar>();
    nodeList=doc.getElementsByTagName("ToolBar");
    for (int j = 0; j < nodeList.getLength(); j++) {
    toolBar=new ToolBar();
    namedNodeMap=nodeList.item(j).getAttributes();
    codeValue=namedNodeMap.getNamedItem("code").getNodeValue();
    nameValue=namedNodeMap.getNamedItem("name").getNodeValue();
    urlValue=namedNodeMap.getNamedItem("url").getNodeValue();
    if(namedNodeMap.getNamedItem("right")!=null) rightValue=namedNodeMap.getNamedItem("right").getNodeValue();
    toolBar.setCode(Integer.parseInt(codeValue));
    toolBar.setName(nameValue);
    toolBar.setUrl(urlValue);
    if(rightValue!=null){
    if(rightValue.equals("true")) toolBar.setRight(true);
    else toolBar.setRight(false);
    }
    //判读ToolBar是否有子节点
    if(nodeList.item(j).hasChildNodes()){
    //LeftMenu
    nodeList=doc.getElementsByTagName("LeftMenu");
    leftMenuChildren=new ArrayList<LeftMenu>();
    for (int k = 0; k < nodeList.getLength(); k++) {
    leftMenu=new LeftMenu();
    namedNodeMap=nodeList.item(k).getAttributes();
    codeValue=namedNodeMap.getNamedItem("code").getNodeValue();
    nameValue=namedNodeMap.getNamedItem("name").getNodeValue();
    urlValue=namedNodeMap.getNamedItem("url").getNodeValue();
    if(namedNodeMap.getNamedItem("right")!=null) rightValue=namedNodeMap.getNamedItem("right").getNodeValue();
    leftMenu.setCode(Integer.parseInt(codeValue));
    leftMenu.setName(nameValue);
    leftMenu.setUrl(urlValue);
    if(rightValue!=null){
    if(rightValue.equals("true")) leftMenu.setRight(true);
    else leftMenu.setRight(false);
    }
    leftMenuChildren.add(leftMenu);
    }
    toolBar.setChildren(leftMenuChildren);
    }
    toolBarChildren.add(toolBar);
    }
    myMenu.setChildren(toolBarChildren);
    }
    myMenus.add(myMenu);
    }




    for (MyMenu myMenu2 : myMenus) {
    System.out.println(myMenu2.getCode()+" "+myMenu2.getName()+" "+myMenu2.getRight());
    if(myMenu2.getChildren()!=null){
    for (ToolBar toolBar2 : myMenu2.getChildren()) {
    System.out.println("   "+toolBar2.getCode()+" "+toolBar2.getName()+" "+toolBar2.getUrl()+" "+toolBar.getRight());
    if(toolBar2.getChildren()!=null){
    for (LeftMenu leftMenu2 : toolBar2.getChildren()) {
    System.out.println("      "+leftMenu2.getCode()+" "+leftMenu2.getName()+" "+leftMenu2.getUrl()+" "+leftMenu2.getRight());
    }
    }
    }
    }
    }

    }

    private static String readFromFile(String fileName) throws Exception{
    //可变字符串
    StringBuffer sb=new StringBuffer(1024);

    try{
    File file=new File(fileName);
    FileReader fr=new FileReader(file);
    BufferedReader br=new BufferedReader(fr);
    String str=br.readLine();
    while(str!=null){
    sb.append(str+"\r\n");
    str=br.readLine();
    }
    }catch(Exception ex){
    ex.printStackTrace();
    throw ex;
    }
    return sb.toString();
    }


    }
      

  9.   

    提醒一句,进行Boolean.valueOf(p)操作时,如果p为null,则返回结果为false。
    lz请注意元素取值为空的情况.我没有进行判空操作
      

  10.   

    OK了!晚上回去的试试……要做毕业设计用。后来发现这么做还不如把这些menu都写到数据库读的方便,可能是没这么做过的原因吧。再后来……既然想法都有了,就这么做吧,正好了解下这些不知道的东西,尝试一下创新~呵呵~~~谢谢你了!有问题的再找你帮忙~
      

  11.   

    老大~是这样的……我是在web项目中用到的这个东西……
    然后getPath()的时候我的路径中有空格,它会解析成什么“%20“之类的东西……这个怎么解决好啊?不会是要写个方法,判断是否有那个符号,有的话转换成空格吧……???
    URL url = ReadMyMenu.class.getClassLoader().getResource(filename);
            File file = new File(url.getPath());