一个解析xml数据的问题,求方案

fuqiang229 2008-08-21 05:11:00


了解xml解析的人都知道,sax是基于事件的,也就是说一边读,一边去处理事件,比如读到<author>时标签开始,这

时我们可以把<author>TT</author>中的数据"TT"读出来,然后从网络上发送出去.这样的好处是不用把整个树全拿出来再处理,不浪费内存.如果我们这样的标签有10G个,那这样就太方便了.
如果反过来我这里从网络不停的传过来数据,好多,我想把它存成一个xml文件,要有10G个标签..我总不能先构建整个树再存吧.于是我就想到了sax.一边读到数据一边写成xml,
可惜,我看了xml解析好几天也没有看到有这么用sax的,
我从jaxp到jdom到dom4j全看了,没有这么用的啊????

XMLWriter writer = new XMLWriter(out, outformat);
writer.write(this.doc); //全是这么用的,先构建好doc,然后再写,恐怖~~~~,哪有那么大的内存啊.
writer.flush();

我的问题就是:像我这种写数据的应该用什么方案,应该用sax吗?如果不用那我用什么呢?
谁给我一个解决的方法啊,谢谢...........最好再有点代码??

谢谢..
...全文
108 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuqiang229 2008-08-23
  • 打赏
  • 举报
回复
dom4j也可以写
fuqiang229 2008-08-23
  • 打赏
  • 举报
回复
他说对了可以写的,试试就知道了.
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;

import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;


public class SAXWriteTest {

/**
* @param args
* @throws FileNotFoundException
* @throws IllegalArgumentException
* @throws TransformerFactoryConfigurationError
* @throws TransformerConfigurationException
* @throws SAXException
*/
public static void main(String[] args) throws IllegalArgumentException, FileNotFoundException, TransformerConfigurationException, TransformerFactoryConfigurationError, SAXException {
TransformerHandler handler = ((SAXTransformerFactory)SAXTransformerFactory.newInstance()).newTransformerHandler();
handler.setResult(new StreamResult(new FileOutputStream("abc.txt")));//这里给定输出位置

handler.startDocument();
AttributesImpl attrs = new AttributesImpl();

attrs.addAttribute("", "", "attrName", "", "attrValue");

handler.startElement("", "", "ROOT", attrs);
handler.endElement("", "", "ROOT");
handler.endDocument();

}

}
ChDw 2008-08-22
  • 打赏
  • 举报
回复
SAXTransformerFactory 就是用SAX方式进行XML的写操作
donyoung 2008-08-22
  • 打赏
  • 举报
回复
SAX是只读的,不能用来写XML内容。你接收到的数据是什么格式的?也是XML的?
可以考虑StAX
fuqiang229 2008-08-21
  • 打赏
  • 举报
回复
不过这么用的好象真的很少...一般都是读...
fuqiang229 2008-08-21
  • 打赏
  • 举报
回复
很强大~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fuqiang229 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ChDw 的回复:]
是,那个是JDK中自带的类,不需要额外的包的。你用JDK1.4以上都可以编译和使用
[/Quote]
那你知道dom4j用什么实现类似功能吗?
ChDw 2008-08-21
  • 打赏
  • 举报
回复
TransformerHandler extends ContentHandler的,那些方法在ContentHandler声明
fuqiang229 2008-08-21
  • 打赏
  • 举报
回复
从接口 org.xml.sax.ContentHandler 继承的方法
characters, endDocument, endElement, endPrefixMapping, ignorableWhitespace, processingInstruction, setDocumentLocator, skippedEntity, startDocument, startElement, startPrefixMapping
从接口 org.xml.sax.ext.LexicalHandler 继承的方法
comment, endCDATA, endDTD, endEntity, startCDATA, startDTD, startEntity

看见了.............
ChDw 2008-08-21
  • 打赏
  • 举报
回复
是,那个是JDK中自带的类,不需要额外的包的。你用JDK1.4以上都可以编译和使用
fuqiang229 2008-08-21
  • 打赏
  • 举报
回复
javax.xml.transform.sax
接口 TransformerHandler????????????/
不是这个吧..
String getSystemId()
获取要从其解析相对 URL 的基本 ID(URI 或系统 ID)。
Transformer getTransformer()
获取与此处理程序关联的 Transformer,用于设置参数和输出属性。
void setResult(Result result)
设置与用于转换的此 TransformerHandler 关联的 Result。
void setSystemId(String systemID)
设置要从其解析相对 URL 的基本 ID(URI 或系统 ID)。
没有你说的方法.
fuqiang229 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ChDw 的回复:]
Java codeTransformerHandler handler = ((SAXTransformerFactory)SAXTransformerFactory.newInstance()).newTransformerHandler();
handler.setResult(new StreamResult(writer));//这里给定输出位置

handler.startDocument();
AttributesImpl attrs = new AttributesImpl();

attrs.addAttribute("", "", "attrName", "", "attrValue");

handler.startElement("", "", "ROOT", attrs);
handler.endElement(…
[/Quote]
这是哪里的类?dom4j??眼生,不过看意思好象就是我要的.
fuqiang229 2008-08-21
  • 打赏
  • 举报
回复
谢谢,我看一下
atealxt 2008-08-21
  • 打赏
  • 举报
回复
关于解析,印象中数据量少用DOM,多则用SAX较好。

写XML没怎么接触过,也许这个能帮你:)
StAX
http://www.ibm.com/developerworks/cn/xml/x-stax3.html#N101A0
ChDw 2008-08-21
  • 打赏
  • 举报
回复
TransformerHandler handler = ((SAXTransformerFactory)SAXTransformerFactory.newInstance()).newTransformerHandler();
handler.setResult(new StreamResult(writer));//这里给定输出位置

handler.startDocument();
AttributesImpl attrs = new AttributesImpl();

attrs.addAttribute("", "", "attrName", "", "attrValue");

handler.startElement("", "", "ROOT", attrs);
handler.endElement("", "", "ROOT");
handler.endDocument();



这样就可以用SAX的方式操作写XML过程了
fuqiang229 2008-08-21
  • 打赏
  • 举报
回复
为什么没人回我呢?想了好几天了,求求各位大侠了..

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧