Sax Parser,何我将解析数据写入文件? [英] Sax Parser ,Ho Do I Write The Parsed Data To File ?

查看:146
本文介绍了Sax Parser,何我将解析数据写入文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想向以下解析器插入保存已解析数据的能力。

我是否需要在每个已解析的行中写入新文件,或者我可以将所有已处理的数据直接保存到文件中main()方法?



P.s.我是Java语言的新手,任何支持都将受到赞赏。

提前Thx。



TrivialSAXHandler

I want to insert to following parser the ability to save parsed data.
Do i need to write to the new file every parsed line ,or i can save all the processed data directly into file from main() method ?

P.s. Im a new to Java language and any support will be appreciated.
Thx in advance.

TrivialSAXHandler

import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

class TrivialSAXHandler extends DefaultHandler {
    
        public void newFile(){
            try {
                PrintWriter writer = new PrintWriter("nouveauDemo.xml");
            } catch (FileNotFoundException ex) {
                Logger.getLogger(TrivialSAXHandler.class.getName()).log(Level.SEVERE, null, ex);
                System.err.println("File not found");
            }

}
	public void setDocumentLocator(Locator locator) {   
                                       System.out.println("Location : " +
                                                 "publicId=" + locator.getPublicId() +
                                                 "systemId=" + locator.getSystemId());
	}
	public void startDocument(){            
		System.out.println("Debut RSS");
	}
	public void endDocument(){           
		System.out.println("Fin RSS");
                
	}
	public void startElement(String namespace,String qualname,Attributes atts) {
            
		 System.out.println("Debut de balise : " +
                                    "namespace=" +namespace +
                                    "qualname="  +qualname);
		 System.out.println("NB atttibuts : " +
				     atts.getLength());
		for (int i=0;i<atts.getLength();i++) System.out.println("NB atttibuts : " +i+ " name "+atts.getQName(i)+"  = "+atts.getValue(i));
	}
	public void endElement(String namespace,String qualname) {
		System.out.println("Balise fermante : " + 
				   "namespace="+namespace+
				   "qualname="+qualname);
                
	}
	public void characters(char[] ch, int start, int length) {
		System.out.print("Info: ");
		for(int i = start; i < start+length; i++)
			System.out.print(ch[i]);
		
	}

	public void error(SAXParseException e) {
		System.err.println("Erreur non fatale (ligne " +
				e.getLineNumber() + ", col " +
				e.getColumnNumber() + ") : " + e.getMessage());
	}
	public void fatalError(SAXParseException e) {
		System.err.println("Erreur fatale : " + e.getMessage());
	}
	public void warning(SAXParseException e) {
		System.err.println("warning : " + e.getMessage());
	}
}





TrivialSAXRead(主要)



TrivialSAXRead (main)

import java.io.InputStream;
import java.io.FileInputStream;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;

class TrivialSAXRead {
	public static void main(String [] args)

			throws Exception
			{
		System.out.println("Demarrage SAX");

		SAXParserFactory parserFactory = SAXParserFactory.newInstance();

		SAXParser parser = parserFactory.newSAXParser();

		for(int i = 0; i < args.length; i++) {

			InputStream is = new FileInputStream(args[i]);
			parser.parse(is, new TrivialSAXHandler());
		}
			}
}

推荐答案

你需要1)打开文件,2)解析XML; 3)关闭文件。在你的SAX处理程序中,用写入文件的语句替换 System.out.println(...)



让我们考虑单独写入文件,单独解析,然后将它们放在一起。



首先,让我们假设您要编写一些已解析的数据到一个文本文件。写作时,让我们使用类 java.io.PrintWriter

https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html [ ^ ]。



所以,写入文件看起来像

You need to 1) open the file, 2) parse XML; 3) close the file. In your SAX handler, replace you System.out.println(...) with the statement writing to the file.

Let's consider writing to the file separately, parsing separately, and the put it all together.

First, let's assume you want to write some parsed data to a text file. For writing, let's use the class java.io.PrintWriter:
https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html[^].

So, writing to the file looks like
PrintWriter writer = new PrintWriter(outputFileName, encoding); // look at documentation for the detail

// ...

writer.println("some text");

// ...

writer.close();



如果以二进制形式书写,这种情况看起来非常相似;那么你可以使用类 java.io.FileOutputStream

https://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html [ ^ ]。



要将它们放在一起,您必须将对作者的引用传递给您编写内容的每个处理程序方法。怎么样?你没有为此目的的参数。通过隐式this参数,它是对实例的引用。因此,您需要将作者的引用作为SAX处理类的成员,即实例字段。



最简单的方案如下所示:添加一个类构造函数接受writer(或二进制流)引用或文件名(然后从该构造函数中的名称创建writer实例或二进制流)。将获得的编写器/流引用分配给您的字段。在每个SAX处理程序方法中,使用此引用进行编写。在解析结束时,关闭文件。如果构造函数创建了writer / stream对象,请在析构函数中将其关闭。如果您从外部代码传递已创建的编写器/流,请在解析后在外部代码中关闭该文件。



-SA


这篇关于Sax Parser,何我将解析数据写入文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆