自己写的一个类继承了DefaultHandler,我只想解析XML文档的前一个元素,例如:
<topic>
  <src>http://bbs.sh.liba.com/t_507_2433949_1.htm</src> 
。。

后面还有很多元素,我只想得到src中的那个URL,其他的没必要解析。
可是startElement,endElement这些方法它会自动调用,知道文件结尾。
谁能告诉我,如果只要解析很少的一部分,该怎么做啊?谢谢啦

解决方案 »

  1.   

    如果是我:
    我使用dom4j来解析
    --可以想解析多少就解析多少!操作灵活
      

  2.   

    如果你只是想 解析 startElement,endElement这些方法它会自动调用,可以用 正则,也可以用 apache 的 commonLang  项目中的 StringUtil.SubstringsBetween
    这两个的性能可能会高些吧如果你还有其他的要求, dom4j可能会更好些,
      

  3.   

    dom4j 用 xpath 来解决 /**/src 具体的可能要查下
      

  4.   

    books.xml: 
    <?xml version="1.0" encoding="GBK"?>
    <books>
      <bookone title="XML study" publisher="angellove workers">
        <article level="high" date="December-2007">
          <title>Java configuration with XML</title>
          <author>
            <firstname>angel</firstname>
            <lastname>free</lastname>
          </author>
        </article>
      </bookone>
    </books>
    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.Element;
    import org.dom4j.io.XMLWriter;
    import org.dom4j.Attribute;
    import org.dom4j.DocumentException;
    import org.dom4j.io.SAXReader;
    import org.dom4j.QName;
    public class dom4j {
        public void readAttribute(String filename, String xpath, String attribute) {
            SAXReader saxReader = new SAXReader();
            try {
                Document document = saxReader.read(new File(filename));
                List list = document.selectNodes(xpath);
                Iterator iter = list.iterator();
                while (iter.hasNext()) {
                    Element element = (Element) iter.next();
                }
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }
        public static void main(String[] argv) {
            dom4j ptree = new dom4j();
            ptree.modifyXML();
            ptree.mymodifXML(new File("books.xml.xml") );
        }
                 //    使用XPath表达式的查询
             public void modifXML(File inputXml) {
               try {//创建一个读取xml文件的对象
                 SAXReader saxReader = new SAXReader();//读取并获得xml文档
                 Document document = saxReader.read(inputXml);
                 //使用XPATH表达式从article元素中获得level节点列表
                 List list = document.selectNodes("//article/@level");
                 //创建一个迭代器.
                 Iterator iter = list.iterator();
                 while (iter.hasNext()) {
                   //获得level节点的属性
                   Attribute attribute = (Attribute) iter.next();
                   if (attribute.getValue().equals("high"))            
                     attribute.setValue("low");//设置属性的值
                 }
                 list = document.selectNodes("//article/@date");
                 iter = list.iterator();
                 while (iter.hasNext()) {
                   Attribute attribute = (Attribute) iter.next();
                   if (attribute.getValue().equals("December-2007"))
                     attribute.setValue("October-2006");
                 }
                 list = document.selectNodes("//article");
                 iter = list.iterator();
                 while (iter.hasNext()) {
                   Element element = (Element) iter.next();
                   Iterator iterator = element.elementIterator("title");
                   while (iterator.hasNext()) {
                     Element titleElement = (Element) iterator.next();
                     //获得属性的文本.
                     if (titleElement.getText().equals("Java configuration with XML"))
                       //重新设置属性的文本
                       titleElement.setText("good good study,day day up");
                   }
                 }
                 list = document.selectNodes("//article/author");
                 iter = list.iterator();
                 while (iter.hasNext()) {
                   Element element = (Element) iter.next();
                   Iterator iterator = element.elementIterator("firstname");
                   while (iterator.hasNext()) {
                     Element firstNameElement = (Element) iterator.next();
                     if (firstNameElement.getText().equals("angel"))
                       firstNameElement.setText("god");
                   }
                 }
                 list = document.selectNodes("//article/author");
                 iter = list.iterator();
                 while (iter.hasNext()) {
                   Element element = (Element) iter.next();
                   Iterator iterator = element.elementIterator("lastname");
                   while (iterator.hasNext()) {
                     Element lastNameElement = (Element) iterator.next();
                     if (lastNameElement.getText().equals("free"))
                       lastNameElement.setText("dark");
                   }
                 }
                 OutputFormat format = OutputFormat.createPrettyPrint();
                 format.setEncoding("GBK");
                 XMLWriter output = new XMLWriter(new FileWriter(new File("modifyBooks.xml")), format);
                 output.write(document);
                 output.close();
               }catch (DocumentException e) {
               }catch (IOException e) {
               }
             }
        //访问其中某一特定节点
        public void modifyXML() {
            try {
                SAXReader sreader = new SAXReader();
                Document document = sreader.read(new File("E:\\eagle\\jms\\exc1.xml")); // E:\\eagle\\jms\\exc1.xml
                Element element = document.getRootElement();
                //获得根元素的名字
                String rootname = element.getName();
                String textname = element.getText();
                System.out.println("rootname=" + rootname);
                //获得指定QName,prefix,uri
                QName qname = element.getQName();
                //获得当前元素指定属性的值
                List list = element.elements();
                Iterator iterator = list.iterator();
                while (iterator.hasNext()) {
                    Element node = (Element) iterator.next();
                    if ("InfStatus1".equals(node.attributeValue("RequestObject"))) {
                        //重新设置当前元素的名字
                        node.setName("InfEXC");
                    }
                    if ("Head".equals(node.getName())) {
                        node.setName("Head");
                    } else {
                        iterator = node.elementIterator();
                    }
                }
                OutputFormat format = OutputFormat.createPrettyPrint();
                format.setEncoding("utf-8");
                XMLWriter output = new XMLWriter(new FileWriter(new File("E:\\eagle\\jms\\modifyExc.xml")), format);
                output.write(document);
                output.close();
            } catch (DocumentException e) {
            } catch (IOException e) {
            }
        }
    }