我需要解析一个xml文件,xml文件的结构如下所示:<Response>
<Object>
<Element>ID</Element>
<Element>XM</Element>
<Element>GMS</Element>
<Element>XB</Element>
</Object>
<Records> <Record>
<Element>GMS</Element>
<Value></Value>
</Record>
<Record>
<Element>ID</Element>
<Value>0011f887252346818a59fedffe6d7821
</Value>
</Record>
<Record>
<Element>XM</Element>
<Value>李明</Value>
</Record>
<Record>
<Element>XB</Element>
<Value>男</Value>
</Record>
<Record>
<Element>GMS</Element>
<Value>1111111111111111111</Value>
</Record>
<Record>
<Element>ID</Element>
<Value>0015224632e9476aaa8f419dcfc222b9
</Value>
</Record>
<Record>
<Element>XM</Element>
<Value>柳眉</Value>
</Record>
<Record>
<Element>XB</Element>
<Value>女</Value>
</Record>
</Records>
<Response>其中<Object>中的内容是每一个人所具有的属性,<Records>里面的内容是每个人对应属性的数值。
然后再对其进行修改操作,我原来使用的是dom4j,但对于大数据量的xml文件操作时就会出现内存溢出错误。因此我现在换用了SAX来解析,因为SAX是事件触发的,遇到换行或者空白时也会触发void characters(char ch[], int start, int length),解析出好多无关的比如"\n"的字符,怎样只获取到数值内容忽略掉无关内容,比如对于后一条记录获取到如下内容:
GMS
1111111111111111111
ID
0015224632e9476aaa8f419dcfc222b9
XM
柳眉
XB
女
我获取到字符内容后还要进行判断修改操作,如何判断获取到的某一项内容,比如GMS对应的数值内容为空呢。我原来是将characters()方法 中获取到的字符内容放在List中,但我发现里面的无关内容太多,并且当某一项为空时List里面并没有存放相应的null或者" "。处理30M以上的xml如果不用sax,还有没有其他的方法。这个问题已经困扰我四五天了,一直没解决掉,还请大家多帮忙、多指教啊。
<Object>
<Element>ID</Element>
<Element>XM</Element>
<Element>GMS</Element>
<Element>XB</Element>
</Object>
<Records> <Record>
<Element>GMS</Element>
<Value></Value>
</Record>
<Record>
<Element>ID</Element>
<Value>0011f887252346818a59fedffe6d7821
</Value>
</Record>
<Record>
<Element>XM</Element>
<Value>李明</Value>
</Record>
<Record>
<Element>XB</Element>
<Value>男</Value>
</Record>
<Record>
<Element>GMS</Element>
<Value>1111111111111111111</Value>
</Record>
<Record>
<Element>ID</Element>
<Value>0015224632e9476aaa8f419dcfc222b9
</Value>
</Record>
<Record>
<Element>XM</Element>
<Value>柳眉</Value>
</Record>
<Record>
<Element>XB</Element>
<Value>女</Value>
</Record>
</Records>
<Response>其中<Object>中的内容是每一个人所具有的属性,<Records>里面的内容是每个人对应属性的数值。
然后再对其进行修改操作,我原来使用的是dom4j,但对于大数据量的xml文件操作时就会出现内存溢出错误。因此我现在换用了SAX来解析,因为SAX是事件触发的,遇到换行或者空白时也会触发void characters(char ch[], int start, int length),解析出好多无关的比如"\n"的字符,怎样只获取到数值内容忽略掉无关内容,比如对于后一条记录获取到如下内容:
GMS
1111111111111111111
ID
0015224632e9476aaa8f419dcfc222b9
XM
柳眉
XB
女
我获取到字符内容后还要进行判断修改操作,如何判断获取到的某一项内容,比如GMS对应的数值内容为空呢。我原来是将characters()方法 中获取到的字符内容放在List中,但我发现里面的无关内容太多,并且当某一项为空时List里面并没有存放相应的null或者" "。处理30M以上的xml如果不用sax,还有没有其他的方法。这个问题已经困扰我四五天了,一直没解决掉,还请大家多帮忙、多指教啊。
解决方案 »
- 按纽事件如何处理?
- JTree如何实现双击时不展开结点(即只能点击图标才展开)??
- 我找到windows installer可是启动不了,按启动后提示:本地计算机的的windows installer服务启动后又停止了.一些服务自动停止,如果它们没有什么可做的.例如:性能日志和敬报的服务.
- 时间格式的正则表达式
- (在线等)Exception in thread "main" java.lang.NoClassDefFoundError: Hello
- JSP高手请入座~~~~在线!
- Koham 请进!
- 请问用什么工具写java??(我是新手)
- 恨不能给300分请教用JDK获取Windows OS的底层信息 !
- 这段代码的结果是什么?为什么?
- 请帮我看一段代码 百思不解
- f.getContentPane()
import java.io.IOException;import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamException;import javax.xml.stream.events.XMLEvent;
import javax.xml.stream.events.Characters;public class Example {
public static void main(final String[] args) {
try(FileReader reader = new FileReader("/tmp/response.xml")){
XMLInputFactory factory = XMLInputFactory.newFactory();
factory.setProperty("javax.xml.stream.isCoalescing",Boolean.TRUE);
XMLEventReader xereader = factory.createXMLEventReader(reader);
while(xereader.hasNext()){
XMLEvent e = xereader.nextEvent();
if(e.isCharacters()){
Characters cdata = e.asCharacters();
if(cdata.isWhiteSpace()) continue;
System.out.println(cdata.getData());
}
}
xereader.close();
} catch (XMLStreamException|IOException e){
System.err.println(e.getMessage());
}
}
}
ID
XM
GMS
XB
GMS
ID
0011f887252346818a59fedffe6d7821
XM
李明
XB
男
GMS
1111111111111111111
ID
0015224632e9476aaa8f419dcfc222b9
XM
柳眉
XB
女
你好 谢谢你的回复,这种方法不是用的SAX是吧?对于30M以上的xml文件会不会出现内存溢出呢?
恩 谢谢 我刚才试了一下 是不是这种方法必须保证标签完全是<tag></tag>这种格式的吗?我的标签里有些属性的值为空时,就会写作 <Element>GMSFZHM</Element>
<Value />
而不是完整的<value></value>这样我运行是就会报这样的错误:
Message: The element type "Value" must be terminated by the matching end-tag "</Value>".
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:588)
at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:85)
at sax.Example.main(Example.java:24)
我使用的是java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Client VM (build 21.0-b17, mixed mode, sharing)
<Record>
<Element>GMS</Element>
<Value></Value>
</Record>
==>
<Record>
<Element>GMS</Element>
<Value />
</Record>
没有问题。
import java.io.FileReader;import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.XMLEvent;public class Example {
public static void main(final String[] args) {
try {
FileReader reader = new FileReader("/tmp/response.xml");
XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setProperty("javax.xml.stream.isCoalescing",Boolean.TRUE);
XMLEventReader xereader = factory.createXMLEventReader(reader);
while(xereader.hasNext()){
XMLEvent e = xereader.nextEvent();
if(e.isCharacters()){
Characters cdata = e.asCharacters();
if(cdata.isWhiteSpace()) continue;
System.out.println(cdata.getData());
}
}
xereader.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FactoryConfigurationError e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XMLStreamException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
FileReader 那里需要修改为你自己的xml文件。循环那部分,根据你的实际需要修改,参考几个类的文档。