不了解java程序的结果

时间:2016-10-12 10:41:53

标签: java sax

我蚂蚁为另一个应用程序研究此代码。但我对'#34;字符"有疑问。 代码如下:

package tp1;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author jgmorenof
 */
class DeathOf extends DefaultHandler {

    String node = null;
    String contenu = null;
    String titre = null;
    String motif = "death of";

    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        node = qName;
        if (node.equals("title") || node.equals("text")) {
            contenu = "";
        }
    }

    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (node != null && node.equals("title")) {
            //System.out.println(contenu);
            titre = contenu;
            //System.out.println("\t\tTitre : " + titre);
        }

        if (node != null && node.equals("text")){
            annotate(contenu);
        }
        node = null;
        contenu = null;
    }

    public void characters(char[] ch, int start, int length) {
        if (node != null && (node.equals("title") || node.equals("text"))) {
            contenu += new String(ch, start, length);
            System.out.println(contenu);
        }
    }

    public static void main(String[] args) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();

            parser.parse("simplewiki-20161001-pages-articles.xml", new DeathOf());


        } catch (Exception e) {
            e.printStackTrace();
        }
    }



    private void annotate(String contenu) {
        String pattern = motif+" [A-Z][a-zA-Z_0-9]+ [A-Z][a-zA-Z_0-9]+";
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(contenu);
        if (m.find( )) {
            for(int i=0;i<=m.groupCount();i++)
                System.out.println("Personne: " + m.group(i).replace(motif,"") );
        }
    }
}

我不理解&#34;字符&#34;的结果。在我的&#34; system.out.println(contenu)&#34;之后。我也不能与SAX相容。 任何人都可以向我解释公共空白字符吗?为什么contenu不再是ampty?从哪里出发,开始,等等。来自哪里?

1 个答案:

答案 0 :(得分:4)

因此,首先,SAX解析器通过在类中调用方法来工作。这就是该类实现DefaultHandler接口的原因。

这些公共方法, startElement endElement characters 因此在执行其工作时由SAX解析器调用!

你知道,你写了那些方法,所以你应该知道他们在做什么!

但是很好:

public void characters(char[] ch, int start, int length) {

如上所述:SAX解析器实现调用该方法 - 它使用的是与XML文件内容相对应的值!

然后:

  if (node != null && (node.equals("title") || node.equals("text"))) {
        contenu += new String(ch, start, length);

上面创建了一个新的String值...并且附加到 contenu

换句话说:该字段 contenu 会发生变化......因为代码说应该更改它。

说真的:如果你不理解这些基本的东西;那么就不要搞XML解析了。相反,请退一步了解Java的基础

如果你想了解发生了什么:只需将print语句放在每个公共方法中(也打印给每个方法的参数)......然后你会很快看到以哪种顺序和SAX解析器调用这些方法的参数是什么!