//package org.xmlpull.v1.samples;
import java.io.*;
import org.kxml2.io.*;
import org.xmlpull.v1.*;
public class Roundtrip {
//private static final String FEATURE_XML_ROUNDTRIP=
// "http://xmlpull.org/v1/doc/features.html#xml-roundtrip";
XmlPullParser parser;
XmlSerializer serializer;
public Roundtrip(XmlPullParser parser, XmlSerializer serializer) {
this.parser = parser;
this.serializer = serializer;
}
public void writeStartTag() throws XmlPullParserException, IOException {
//check forcase when feature xml roundtrip is supported
//if (parser.getFeature (FEATURE_XML_ROUNDTRIP)) {
//TODO: how to do pass through string with actual start tag in getText()
//return;
//}
if (!parser.getFeature(parser.FEATURE_REPORT_NAMESPACE_ATTRIBUTES)) {
for (int i = parser.getNamespaceCount(parser.getDepth() - 1);
i < parser.getNamespaceCount(parser.getDepth()) - 1;
i++) {
serializer.setPrefix(
parser.getNamespacePrefix(i),
parser.getNamespaceUri(i));
}
}
serializer.startTag(parser.getNamespace(), parser.getName());
for (int i = 0; i < parser.getAttributeCount(); i++) {
serializer.attribute(
parser.getAttributeNamespace(i),
parser.getAttributeName(i),
parser.getAttributeValue(i));
}
//serializer.closeStartTag();
}
public void writeToken() throws XmlPullParserException, IOException {
switch (parser.getEventType()) {
case XmlPullParser.START_DOCUMENT :
//serializer.startDocument (null,
break;
case XmlPullParser.END_DOCUMENT :
serializer.endDocument();
break;
case XmlPullParser.START_TAG :
writeStartTag();
break;
case XmlPullParser.END_TAG :
serializer.endTag(parser.getNamespace(), parser.getName());
break;
case XmlPullParser.IGNORABLE_WHITESPACE :
//comment it to remove ignorable whtespaces from XML infoset
serializer.ignorableWhitespace(parser.getText());
break;
case XmlPullParser.TEXT :
serializer.text(parser.getText());
break;
case XmlPullParser.ENTITY_REF :
serializer.entityRef(parser.getName());
break;
case XmlPullParser.CDSECT :
serializer.cdsect(parser.getText());
break;
case XmlPullParser.PROCESSING_INSTRUCTION :
serializer.processingInstruction(parser.getText());
break;
case XmlPullParser.COMMENT :
serializer.comment(parser.getText());
break;
case XmlPullParser.DOCDECL :
serializer.docdecl(parser.getText());
break;
default :
throw new RuntimeException(
"unrecognized event: " + parser.getEventType());
}
}
public void roundTrip() throws XmlPullParserException, IOException {
while (parser.getEventType() != parser.END_DOCUMENT) {
writeToken();
parser.nextToken();
}
writeToken();
}
public static void main(String[] args) throws Exception {
if (args.length == 0)
throw new RuntimeException("input xml file name expected");
for (int i = 0; i < args.length; i++) {
System.out.println("processing: " + args[i]);
XmlPullParser pp = new KXmlParser();
pp.setFeature (XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
XmlSerializer serializer = new KXmlSerializer();
pp.setInput(new FileReader(args[i]));
serializer.setOutput(System.out, null);
(new Roundtrip(pp, serializer)).roundTrip();
serializer.flush();
}
}
}