我们用的是Castor的xml解析,觉得非常得心应手,当然个人癖好,也可用JDom,也可用javax.xml.等等。
自己写各类来解析,我认为没有必要。

解决方案 »

  1.   

    你的<r></r>可能还含有<r></r>???如果含有,都要输出,是吗?
      

  2.   

    使用java的dom树来直接生成数据结构不是更好吗?
    试试吧
      

  3.   

    代码1:
    public class TestParseXml
    {
        private static String tag;
        public static java.io.InputStream getXmlStream()
        {
            String xml="<root><r><xx>ddd</xx></r><c><p name=\"5\">erw</p></c><r>trter</r><aa><r>ff</r></aa></root>";
            setFilterTag("r");
            return new java.io.ByteArrayInputStream(xml.getBytes());
        }
        class MyHandler extends org.xml.sax.helpers.DefaultHandler
        {
            private String part=null;
            public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes attributes)
            {
                if (qName.equals(tag))
                {
                    part="<"+tag+">";
                }
                else if (part!=null)
                {
                    part+="<"+qName+">";
                }        }
            public void endElement(String uri, String localName, String qName)
            {
                if (qName.equals(tag))
                {
                    part += "</" + tag + ">";
                    System.out.println(part);
                }
                else
                    part += "</" + qName + ">";
            }
            public void characters(char[] ch, int start, int length)
            {
                part += new String(ch,start,length);
            }    }
        public static void setFilterTag(String tag)
        {
            TestParseXml.tag = tag;
        }
        public static void main(String[] args) throws Exception
        {
           javax.xml.parsers.SAXParserFactory saxParserFtr =
               javax.xml.parsers.SAXParserFactory.newInstance();
           javax.xml.parsers.SAXParser parser = saxParserFtr.newSAXParser();
           java.io.InputStream is = getXmlStream();
           parser.parse(new org.xml.sax.InputSource(is),new TestParseXml().new MyHandler());    }
    }
    输出:
    <r><xx>ddd</xx></r>
    <r>trter</r>
    <r>ff</r>
      

  4.   

    代码2:
    public class TestParseXml
    {
        private static String tag;
        public static java.io.InputStream getXmlStream()
        {
            String xml = "<root><r><xx>ddd</xx></r><c><p name=\"5\">erw</p></c><r>trter</r><aa><r>ff</r></aa></root>";
            setFilterTag("r");
            return new java.io.ByteArrayInputStream(xml.getBytes());
        }
        class MyHandler
            extends org.xml.sax.helpers.DefaultHandler
        {
            private String part = null;
            public void startElement(String uri, String localName, String qName,
                                     org.xml.sax.Attributes attributes)
            {
                if (qName.equals(tag))
                {
    //                part = "<" + tag + ">";
                    part="";
                }
                else if (part != null)
                {
                    part += "<" + qName + ">";
                }
            }
            public void endElement(String uri, String localName, String qName)
            {
                if (qName.equals(tag))
                {
    //                part += "</" + tag + ">";
                    System.out.println(part);
                }
                else
                {
                    part += "</" + qName + ">";
                }
            }
            public void characters(char[] ch, int start, int length)
            {
                part += new String(ch, start, length);
            }
        }
        public static void setFilterTag(String tag)
        {
            TestParseXml.tag = tag;
        }
        public static void main(String[] args) throws Exception
        {
            javax.xml.parsers.SAXParserFactory saxParserFtr =
                javax.xml.parsers.SAXParserFactory.newInstance();
            javax.xml.parsers.SAXParser parser = saxParserFtr.newSAXParser();
            java.io.InputStream is = getXmlStream();
            parser.parse(new org.xml.sax.InputSource(is),
                         new TestParseXml().new MyHandler());
        }
    }
    输出:
    <xx>ddd</xx>
    trter
    ff
      

  5.   

    说明:
    1.原来的xml是:String xml = "<root><r><xx>ddd</xx></r><c><p name=\"5\">erw</p></c><r>trter</r><aa><r>ff</r></aa></root>";
    基本是楼主的,为了适应程序需要,加上了<root>。2.把String xml换成自己的内容就可以了。
    3.代码1的输出含有<r>本身的标记。代码2的输出不含有<r>标记。就是楼主说的<r></r>之间的内容。
    4.已经在JBuilder9+win2k下调试通过。具体使用哪个代码,看需求了。
    5.程序利用了SAX解析机制。没有采用DOM的原因是,DOM一次性加载到内存太浪费了。
    而且遍历DOM也不方便,要自己写递归程序。
    6.so...,代码如上!
      

  6.   

    多谢 feiyuegaoshan(飞跃)兄,
    但您这XML node的属性不能显示出来
      

  7.   


    public class TestParseXml
    {
        private static String tag;
        class MyHandler
            extends org.xml.sax.helpers.DefaultHandler
        {
            private String part = null;
            private String getAttr(org.xml.sax.Attributes t)
            {
                String s="";
                for(int i=0;i<t.getLength();i++)
                {
                    s=s+" " +t.getQName(i) +"=\""+ t.getValue(i)+"\"";
                }
                return s;
            }        public void startElement(String uri, String localName, String qName,
                                     org.xml.sax.Attributes attributes)
            {
                if (qName.equals(tag))
                {
                    part = "<" + tag + getAttr(attributes)+ ">";
    //                part="";
                }
                else if (part != null)
                {
                    part += "<" + qName + getAttr(attributes) + ">";
                }
            }
            public void endElement(String uri, String localName, String qName)
            {
                if (qName.equals(tag))
                {
                    part += "</" + tag + ">";
                    System.out.println(part);
                }
                else
                {
                    part += "</" + qName + ">";
                }
            }
            public void characters(char[] ch, int start, int length)
            {
                part += new String(ch, start, length);
            }
        }
        public static void setFilterTag(String tag)
        {
            TestParseXml.tag = tag;
        }    public static java.io.InputStream getXmlStream()
        {
            String xml = "<root><r><xx test=\"hello!\">ddd</xx></r><c><p name=\"5\">erw</p></c><r>trter</r><aa><r>ff</r></aa></root>";
            setFilterTag("r");
            return new java.io.ByteArrayInputStream(xml.getBytes());
        }
        public static void main(String[] args) throws Exception
        {
            javax.xml.parsers.SAXParserFactory saxParserFtr =
                javax.xml.parsers.SAXParserFactory.newInstance();
            javax.xml.parsers.SAXParser parser = saxParserFtr.newSAXParser();
            java.io.InputStream is = getXmlStream();
            parser.parse(new org.xml.sax.InputSource(is),
                         new TestParseXml().new MyHandler());
        }
    }