使用SAX Filter将新元素插入XML文件
I have an XMl file that looks like:
我有一个XMl文件,看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<game >
<moves>
<turn>2</turn>
<piece nr="1" />
<turn>4</turn>
<piece nr="1" />
</moves>
</game>
I am writing a Java program that takes the XML file as input then parses it with SAX and SAX filter and computes:
我正在编写一个Java程序,它将XML文件作为输入,然后使用SAX和SAX过滤器解析它并计算:
- the sum of the content of turn element (here=6)
- the number of piece elements (here=2)
转弯元素的总和(此处= 6)
零件数量(此处= 2)
Then I want to use a SAX filter in order to generate an output XML file that are the same as the input one but with an additional element like:
然后我想使用SAX过滤器来生成输出XML文件,该输出XML文件与输入XML文件相同,但有一个额外的元素,如:
<s:statistics>
<s:turn-total>6</s:turn-total>
<s:piece-count>2</s:piece-count>
</s:statistics>
The prefix s
is a reference to a namespace.
前缀s是对命名空间的引用。
My program so far is:
到目前为止,我的计划是:
public class test{
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("error ");
System.exit(1);
}
String xmlInput = args[0];
String filteredXML = args[1];
test test1 = new test();
test1.sax(xmlInput, filteredXML);
}
private void sax(String gameXML, String filteredGameXML)throws Exception{
FileInputStream fis = new FileInputStream( gameXML);
InputSource is = new InputSource(fis);
XMLReader xr = XMLReaderFactory.createXMLReader();
XMLFilter xf = new MyFilter();
xf.setParent(xr);
xr = xf;
xr.parse(is);
xr.setFeature("http://xml.org/sax/features/namespaces", true);
DefaultHandler handler = new DefaultHandler();
xr.setContentHandler(handler);
}
private class MyFilter extends XMLFilterImpl{
StringBuffer buffer;
int temp=0;
int sum=0;
String ff;
int numof=0;
private MyFilter() {}
@Override
public void startDocument() throws SAXException {
System.out.println( "START DOCUMENT" );
numof=0;
}
public void startElement(String namespaceURI, String localName, String name, Attributes attributes) throws SAXException{
if(localName.equals("turn")){
buffer=new StringBuffer();
}
if("piece".equals(name)){
numof++;
}
}
public void characters(char[] ch, int start, int length) throws SAXException {
String s=new String(ch, start, length);
if(buffer!=null){
buffer.append(s);
}
}
public void endElement(String uri, String localName, String name)throws SAXException {
if(buffer!=null ){
ff=buffer.toString();
temp=Integer.valueOf(ff);
sum=sum+temp;
}
buffer=null;
}
public void endDocument() throws SAXException {
System.out.println( "END DOCUMENT" );
System.out.println("sum of turn: "+ sum);
System.out.println("sum of piece: "+ numof);
}
}
}
What should I do next?
接下来我该怎么办?
3 个解决方案
#1
4
Your XMLFilter
should delegate to another ContentHandler
that serializes the document based on the sax events.
您的XMLFilter应委托给另一个基于sax事件序列化文档的ContentHandler。
SAXTransformerFactory factory = (SAXTransformerFactory)TransformerFactory.newInstance();
TransformerHandler serializer = factory.newTransformerHandler();
Result result = new StreamResult(...);
serializer.setResult(result);
XMLFilterImpl filter = new MyFilter();
filter.setContentHandler(serializer);
XMLReader xmlreader = XMLReaderFactory.createXMLReader();
xmlreader.setFeature("http://xml.org/sax/features/namespaces", true);
xmlreader.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
xmlreader.setContentHandler(filter);
xmlreader.parse(new InputSource(...));
Your callback should delegate to the super
implementation, which forwards the events to the serializing ContentHandler
.
您的回调应该委托给超级实现,后者将事件转发给序列化的ContentHandler。
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
super.startElement(namespaceURI, localName, qName, atts);
...
}
In your endElement
callback you can check if your are at the final closing tag and add additional sax events.
在endElement回调中,您可以检查您是否处于最终结束标记并添加其他sax事件。
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
super.endElement(namespaceURI, localName, qName);
if ("game".equals(localName)) {
super.startElement("", "statistics", "statistics", new AttributesImpl());
char[] chars = String.valueOf(num).toCharArray();
super.characters(chars, 0, chars.length);
super.endElement("", "statistics", "statistics");
}
...
}
更多相关文章
- java写入文件的几种方法小结
- 小聊天程序,访问文件之间的变量
- 请问用Java如何逐行的读取一个文本文件呀?我现在只能完整读取.
- FilenameFilter文件名过滤器使用实例
- java操作ftp实现文件的上传下载(适用于图片文档服务器)
- 怎么在html,Javascript,vBscript中实现从网页上接收数据存入文本
- Spring 3.0将文件注入资源
- 在tomcat服务器中部署war文件
- Java,Socket&TCP编程 实现多线程端对端通信与文件传输