SAX,DOM,JDOM...
推荐用jdom,用法和例子看www.jdom.org

解决方案 »

  1.   

    易用性方面,JDom或dom4j都不错。而jdk自带的dom极不方便。
    效率方面,就用sax吧, 速度最快。我曾经在一个程序中试过用DOM和SAX,而SAX的效率是DOM的75倍!
      

  2.   

    JDOM1.生成XML:*********************************
    package xmldemo.jdom;import java.io.IOException;
    import org.jdom.CDATA;
    import org.jdom.Document;
    import org.jdom.output.XMLOutputter;
    import org.jdom.Element;
    import java.io.FileOutputStream;
    import java.io.BufferedOutputStream;/**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author tangb
     * @version 1.0
     */public class CreateJdomXML {
        public CreateJdomXML() {
        }
        public static Document createRootNode(String name) {
            Element reportStyle = new Element("ReportStyle");
            Document rootDoc = new Document(reportStyle);        String strId[] = {"资产负债表","现金流量表","销售成本表"};        for (int i = 0; i < strId.length; i ++) {
                reportStyle.addContent(createReportNode(reportStyle, strId[i]));
            }
            return rootDoc;
        }
        public static Element createReportNode(Element reportStyle, String reportName) {
            Element report = new Element("Report");
            report.setAttribute("name",reportName);
            int itemNum = getItemCodeNum(reportName);
            for (int i = 0 ; i < itemNum; i ++) {
                report.addContent(createItemNode(report, reportName, i));
            }
            return report;
        }
        public static Element createItemNode(Element itemNode, String reportName, int codeNum) {        Element itemEle = null;
            itemEle = new Element("ItemName");
            String itemNodeValue = getText(reportName, codeNum);
            itemEle.setAttribute("itemCode", String.valueOf(codeNum));
            itemEle.addContent(new Element("value").addContent(
                    new CDATA(itemNodeValue)));
            return itemEle;
        }
        public static String getText(String reportName, int itemNum) {
            String value = null;
            if (reportName.equals("资产负债表") && itemNum == 0) {
                value = "资产负债表 itemNum0";
            }
            if (reportName.equals("资产负债表") && itemNum == 1) {
                value = "资产负债表 itemNum1";
            }
            if (reportName.equals("现金流量表") && itemNum == 3) {
                value = "现金流量表 itemNum3";
            }
            if (reportName.equals("销售成本表") && itemNum == 2) {
                value = "销售成本表 itemNum2";
            }
            return value;
        }
        public static int getItemCodeNum(String reportName) {
            int itemNum = 0;
            if (reportName.equals("资产负债表")) {
                itemNum = 3;
            }
            if (reportName.equals("现金流量表")) {
                itemNum = 4;
            }
            if (reportName.equals("销售成本表")) {
                itemNum = 5;
            }
            return itemNum;
        }
        public static void main(String[] args) {
            BufferedOutputStream bos = null;
            try {
                bos = new BufferedOutputStream(new FileOutputStream("XML/xmlDemo.xml"));
                Document doc = CreateJdomXML.createRootNode("tan");
                XMLOutputter out = new XMLOutputter("\t", true, "GB2312");
                out.output(doc, bos);
            }catch (Exception ex) {
                ex.printStackTrace();
            } finally{
                if (null != bos) {
                    try {
                        bos.flush();
                        bos.close();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }
    }
    *******************************
      

  3.   

    解析XML  XML文件: xmlDemo.xml
     **********************************************
    <?xml version="1.0" encoding="GB2312"?>
    <ReportStyle>
    <Report name="资产负债表">
    <ItemName itemCode="0">
    <value><![CDATA[资产负债表 itemNum0]]></value>
    </ItemName>
    <ItemName itemCode="1">
    <value><![CDATA[资产负债表 itemNum1]]></value>
    </ItemName>
    <ItemName itemCode="2">
    <value />
    </ItemName>
    </Report>
    <Report name="现金流量表">
    <ItemName itemCode="0">
    <value />
    </ItemName>
    <ItemName itemCode="1">
    <value />
    </ItemName>
    <ItemName itemCode="2">
    <value />
    </ItemName>
    <ItemName itemCode="3">
    <value><![CDATA[现金流量表 itemNum3]]></value>
    </ItemName>
    </Report>
    <Report name="销售成本表">
    <ItemName itemCode="0">
    <value />
    </ItemName>
    <ItemName itemCode="1">
    <value />
    </ItemName>
    <ItemName itemCode="2">
    <value><![CDATA[销售成本表 itemNum2]]></value>
    </ItemName>
    <ItemName itemCode="3">
    <value />
    </ItemName>
    <ItemName itemCode="4">
    <value />
    </ItemName>
    </Report>
    </ReportStyle>
    **********************************************解析代码:
    *********************************************
    package xmldemo.jdom;import java.util.List;
    import java.util.Iterator;
    import org.jdom.Element;
    import org.jdom.Document;
    import org.jdom.input.SAXBuilder;
    import java.io.FileInputStream;
    import java.util.Vector;
    import org.apache.*;
    /**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author tangb
     * @version 1.0
     */public class ParseJdomXML {
        private static final String DEFAULT_SAX_DRIVER_CLASS =
                "org.apache.xerces.parsers.SAXParser";
        private static List docList;
        public ParseJdomXML() {    }
        public static Vector getReport(String xmlName) {
            Vector reportVector = new Vector();
            SAXBuilder builder = new SAXBuilder(DEFAULT_SAX_DRIVER_CLASS);
            try {            FileInputStream fis = new FileInputStream(xmlName);
                Document doc = builder.build(fis);
                Element rootEle = doc.getRootElement();
                docList = rootEle.getChildren("Report");
                //method 1
                for (int i = 0; i < docList.size(); i ++) {
                    Element tempEle = (Element)docList.get(i);
                    String reportName = tempEle.getAttributeValue("name");
                    reportVector.add(tempEle.getAttribute("name"));
                    System.out.println("reportName " + tempEle.getAttribute("name"));
                }
                //method 2
               /* Iterator reportItr = docList.iterator();
                while (reportItr.hasNext()) {
                    Element tempEle = (Element) reportItr.next();
                    String reportName = tempEle.getAttributeValue("name");
                    reportVector.add(tempEle.getAttribute("name"));
                    System.out.println("reportName " + tempEle.getAttribute("name"));
                }*/
                System.out.println("***********************************************");
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }
            return reportVector;
        }
        public static Vector getItem(String reportName) {
            Vector itemVector = new Vector();
            //method 1
            for (int i = 0; i < docList.size(); i ++) {
                Element tempEle = (Element)docList.get(i);
                String str = tempEle.getAttributeValue("name");
                if (reportName.equals(str)) { //判断是否和传过来的名字相同
                    List tempList = tempEle.getChildren();
                    Iterator itemItr = tempList.iterator();
                    while (itemItr.hasNext()) {//如果相同则找出所有这个名字的内容
                        Element itemEle = (Element) itemItr.next();
                        Element valueEle = itemEle.getChild("value");
                        String itemValue= "";
                        if (null != valueEle) {
                            itemValue = valueEle.getText();
                            System.out.println("itemValue " + itemValue);
                            itemVector.add(itemValue);
                        }                }
                    System.out.println("***********************************************");
                }
            }
            //method 2
            /*Iterator reportItr = docList.iterator();
            while (reportItr.hasNext()) { //得到所有的名字
                Element tempEle = (Element) reportItr.next();
                String str = tempEle.getAttributeValue("name");
                if (reportName.equals(str)) { //判断是否和传过来的名字相同
                    List tempList = tempEle.getChildren();
                    Iterator itemItr = tempList.iterator();
                    while (itemItr.hasNext()) {//如果相同则找出所有这个名字的内容
                        Element itemEle = (Element) itemItr.next();
                        Element valueEle = itemEle.getChild("value");
                        String itemValue= "";
                        if (null != valueEle) {
                            itemValue = valueEle.getText();
                            System.out.println("itemValue " + itemValue);
                            itemVector.add(itemValue);
                        }                }
                    System.out.println("***********************************************");
                }        }*/
            return itemVector;
        }
        public static String getCode(String reportName, String value) {//根据值得到 itemCode
            Iterator reportItr = docList.iterator();
            while (reportItr.hasNext()) {
                Element tempEle = (Element) reportItr.next();
                String str = tempEle.getAttributeValue("name");
                if (reportName.equals(str)) {
                    List tempList = tempEle.getChildren();
                    Iterator itemItr = tempList.iterator();
                    while (itemItr.hasNext()) {
                        Element itemEle = (Element) itemItr.next();
                        Element valueEle = itemEle.getChild("value");
                        if (null != valueEle) {
                            String itemName = valueEle.getText();
                            if (itemName.equals(value)) {
                                System.out.println("reportName = " + reportName + "|| " + " value = " + value + "|| " + "itemCode = "
                                        + itemEle.getAttributeValue("itemCode"));
                                return (String)itemEle.getAttributeValue("itemCode");
                            }
                        }                }
                }        }
            return null;
        }
        public static void main(String[] args) {
            try {
                ParseJdomXML.getReport("XML/xmlDemo.xml");            ParseJdomXML.getItem("现金流量表");
                ParseJdomXML.getCode("资产负债表", "资产负债表 itemNum1");
            }
            catch (Exception ex) {
                ex.printStackTrace();
            }    }
    }
    ********************************************
      

  4.   

    SAX:
     XML文件:classConfig.xml
    ************************
    <?xml version="1.0" encoding="gb2312"?><school name="清华大学">
    <grade id ="1" name = "一年">
    <class id="1" name="一班">
    <teacher  name="tan" sex= "男" age="23"/>
    </class>
    <class id="2" name="二班">
    <teacher  name="wu" sex= "女" age="24"/>
    </class>
    <class id="3" name="三班">
    <teacher  name="li" sex= "男" age="28"/>
    </class>
    </grade>
    <grade id ="2" name = "二年">
    <class id="1" name="一班">
    <teacher  name="guo" sex= "女" age="33"/>
    </class>
    <class id="2" name="二班">
    <teacher  name="刘德华" sex= "女" age="35"/>
    </class>
    </grade>
    </school>
      

  5.   

    有sax解析XML的代码吗?我想看看
      

  6.   

    tanguangbin(对不起,本人不灌水)
    -------------------------
    非常感谢。另:怎么我下了jdom-b10后将所有lib下的
    jar文件加上还是提示import org.jdom.CDATA;
    import org.jdom.Document;
    import org.jdom.output.XMLOutputter;这些包找不到。请问:版本有什么要求吗?
    import org.jdom.Element;
      

  7.   

    我知道了:
    是build/jdom.jar谢谢!!
      

  8.   

    public static Element createItemNode(Element itemNode, String reportName, int codeNum) {        Element itemEle = null;
            itemEle = new Element("ItemName");
            String itemNodeValue = getText(reportName, codeNum);
            itemEle.setAttribute("itemCode", String.valueOf(codeNum));
            itemEle.addContent(new Element("value").addContent(
                    new CDATA(itemNodeValue)));
            return itemEle;
        }
    ------------------------
    itemEle.addContent(new Element("value").addContent(
                    new CDATA(itemNodeValue)));提示类型错误,就是参数不匹配。
      

  9.   

    itemEle.addContent(new Element("value").addContent(
                    new CDATA(itemNodeValue)));改为:Element newElement = new Element("value");
    newElement.addContent(new CDATA(itemNodeValue));
    itemEle.addContent(newElement);
    问题解决。
      

  10.   

    抛开具体问题比较DOM和SAX的效率是错误的。如果整个XML都要被处理的话,DOM的效率会比SAX高,要是只取XML文件的一部分,用SAX时,XML文件不进内存,直接找位置,效率当然会高。