java解析xml的问题 300分

Jlins 2011-04-12 12:03:26
下面是xml的结构,我想获取到 <RecordList></RecordList>中的xml串..比如 <a>1</a><b>2</b><c>3</c>
因为文件很大,不能使用dom4j ,xstream一次性读取到内存中,我使用sax读取,但是貌似取不到 xml串,

有谁知道改怎么处理吗?给个简单那的例子,不能占用太多内存
<File>
<FileType>01</FileType>

<RecordList>
<a>1</a><b>2</b><c>3</c>
</RecordList>
<RecordList>
<a>1</a><b>2</b><c>3</c>
</RecordList>
<RecordList>
<a>1</a><b>2</b><c>3</c>
</RecordList>
<RecordList>
<a>1</a><b>2</b><c>3</c>
RecordList
....很多的 RecordList

<File>
...全文
247 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jlins 2011-04-13
  • 打赏
  • 举报
回复
还有一个关键问题是
我只需要其中的xml报文,不需要对报文进行解析,解析的话麻烦,报文中有接近22个实体信息...
[Quote=引用 21 楼 sotom 的回复:]
晕, 这就结贴了, 我们的接口也大多使用报文, 使用xstream 解析, 楼上给出的报文使用xstream是可以解析的。 一次性解析到javabean

没有细看上边回复, 楼主有疑问可以找我
[/Quote]
Jlins 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 sotom 的回复:]
晕, 这就结贴了, 我们的接口也大多使用报文, 使用xstream 解析, 楼上给出的报文使用xstream是可以解析的。 一次性解析到javabean

没有细看上边回复, 楼主有疑问可以找我
[/Quote]
xstream 是一次性装载所有的报文到内存中吧?我的文件太大,数据量太多,不适合xstream 进行装载..
sotom 2011-04-13
  • 打赏
  • 举报
回复
晕, 这就结贴了, 我们的接口也大多使用报文, 使用xstream 解析, 楼上给出的报文使用xstream是可以解析的。 一次性解析到javabean

没有细看上边回复, 楼主有疑问可以找我
Jlins 2011-04-13
  • 打赏
  • 举报
回复
结贴了
Jlins 2011-04-13
  • 打赏
  • 举报
回复
结贴只有前4L 显示阅览次数才21次,说明结贴页面的数据还是昨天的数据,
这样5L以后就没分了,等所有的楼层的数据都同步了之后再结贴吧
Jlins 2011-04-13
  • 打赏
  • 举报
回复
什麽情况?
我结贴只能显示前面4L的数据,后面的都显示不出来?
amos1989 2011-04-13
  • 打赏
  • 举报
回复
好啦。。结账吧。。。

1楼的思维和我比较像,我也比较爱好用flag 哈哈

9楼的相法就是 在parse里面再放一个parse 一个用于读取目标节点,一个用于读取目标节点下我们需要的值,


都看懂了。。。 楼主结账吧。。
amos1989 2011-04-13
  • 打赏
  • 举报
回复
看你的代码参数命名。。哈哈soapMessageflag
amos1989 2011-04-13
  • 打赏
  • 举报
回复
恩。看过了。。思路确实很好。也不麻烦,楼主你在做SOAP? 分步式?
Jlins 2011-04-13
  • 打赏
  • 举报
回复
1L 和 9L的都很好,2个都实现了

1L的实现如下: 信息安全..屏蔽了部分代码 见谅
@Override  
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if("RecordList".equals(qName)){
this.soapMessageflag = true;
}
if(soapMessageflag && !"RecordList".equals(qName))
{
soapMessage.append("<");
soapMessage.append(qName);
soapMessage.append(">");
}
preTag = qName;//将正在解析的节点名称赋给preTag
}

@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("RecordList".equals(qName)){
this.soapMessageflag = false;

System.out.println(soapMessage.toString());

}
if(soapMessageflag && !"RecordList".equals(qName))
{
soapMessage.append("</");
soapMessage.append(qName);
soapMessage.append(">");
}
preTag = null;
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(preTag!=null){
String content ="";
if(xxxx)
{}
else
{
content = new String(ch,start,length);
if(soapMessageflag)
{
soapMessage.append(content);
}
}
}
}

9L的代码很完整
amos1989 2011-04-13
  • 打赏
  • 举报
回复
好,顺便说一下结果情况。。。。 坐等测试结果。。
Jlins 2011-04-13
  • 打赏
  • 举报
回复
1L的方法我已经实现了,9L的代码思路 让我眼前一亮,回去测试,测试完结贴
amos1989 2011-04-13
  • 打赏
  • 举报
回复
其实我觉得用sax的时候自己简单的包装一下,读起来不会很困难。
amos1989 2011-04-13
  • 打赏
  • 举报
回复
1楼的办法可以,9楼的思路再看一下。
tof21 2011-04-12
  • 打赏
  • 举报
回复
java解析XML 有个比较不错的jar包 digester 你可以看看。。
knightzhuwei 2011-04-12
  • 打赏
  • 举报
回复
没有类似node.innerXML质量的方法的话是不是就可以用节点的name+内容人为拼一个字符串出来
knightzhuwei 2011-04-12
  • 打赏
  • 举报
回复
搞个标志位 在startElement里判断 如果是RecordList元素就标志位置为true 然后当标志位为true的时候 在characters和startElement endElement中拼字符串 在endElement判断如果是RecordList就把标志位置为false 就行了吧
magong 2011-04-12
  • 打赏
  • 举报
回复
OK,就是8楼这个思路,两个SAX Handler轮换,可以做,LZ测下性能如何。
代码如下:

public class GetInnerXmlTextDemo {

public static void main(String[] args) throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
xr.setContentHandler(new OuterHandler(xr));
xr.parse("input.xml");
}
}

class OuterHandler implements ContentHandler {

private XMLReader xmlReader;

public OuterHandler(XMLReader xmlReader) {
this.xmlReader = xmlReader;
}

public void setDocumentLocator(Locator locator) {
}

public void startDocument() throws SAXException {
}

public void endDocument() throws SAXException {
}

public void startPrefixMapping(String prefix, String uri)
throws SAXException {
}

public void endPrefixMapping(String prefix) throws SAXException {
}

public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
if("RecordList".equals(qName)) {
xmlReader.setContentHandler(new KeepContentHandler(xmlReader, this));
}
}

public void endElement(String uri, String localName, String qName)
throws SAXException {
}

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

public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
}

public void processingInstruction(String target, String data)
throws SAXException {
}

public void skippedEntity(String name) throws SAXException {
}

}

class KeepContentHandler implements ContentHandler {

private int depth = 1;
private XMLReader xmlReader;
private ContentHandler contentHandler;

public KeepContentHandler(XMLReader xmlReader, ContentHandler contentHandler) {
this.contentHandler = contentHandler;
this.xmlReader = xmlReader;
}

public void setDocumentLocator(Locator locator) {
}

public void startDocument() throws SAXException {
}

public void endDocument() throws SAXException {
}

public void startPrefixMapping(String prefix, String uri)
throws SAXException {
}

public void endPrefixMapping(String prefix) throws SAXException {
}

public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
System.out.print("<"+qName+">");
depth++;
}

public void endElement(String uri, String localName, String qName)
throws SAXException {
depth--;
if(0 == depth) {
xmlReader.setContentHandler(contentHandler);
} else{
System.out.println("</"+qName+">");
}
}

public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.print(new String(ch, start, length));
}

public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
}

public void processingInstruction(String target, String data)
throws SAXException {
}

public void skippedEntity(String name) throws SAXException {
}

}


很好。吃饭去了。
magong 2011-04-12
  • 打赏
  • 举报
回复
用两个Handler交替处理,貌似可以,还没试出来,LZ自己也看看吧

http://stackoverflow.com/questions/3405702/using-sax-to-parse-common-xml-elements/3409270#3409270
龙四 2011-04-12
  • 打赏
  • 举报
回复
StAX行不行?


javax.xml.stream.XMLInputFactory
加载更多回复(2)

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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