我蚂蚁为另一个应用程序研究此代码。但我对'#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?从哪里出发,开始,等等。来自哪里?
答案 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解析器调用这些方法的参数是什么!