У меня есть файл XML, который выглядит как:Вставьте новый элемент в файл XML с помощью SAX Filter
<?xml version="1.0" encoding="UTF-8"?>
<game >
<moves>
<turn>2</turn>
<piece nr="1" />
<turn>4</turn>
<piece nr="1" />
</moves>
</game>
Я пишу программу Java, которая принимает файл XML в качестве входных данных затем анализирует его с SAX и SAX фильтром и вычисляет:
- сумма содержания поворота элемента (здесь = 6)
- количество штучных элементов (здесь = 2)
Затем я хочу использовать SAX фильтр для того, чтобы генерировать выходной файл XML, которые являются такими же, как на вход один, но с дополнительным элементом, как:
<s:statistics>
<s:turn-total>6</s:turn-total>
<s:piece-count>2</s:piece-count>
</s:statistics>
Приставка s
является ссылкой на namespace.
Моя программа до сих пор:
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);
}
}
}
Что я должен делать дальше?
И в чем проблема? Вы сказали нам, чего вы хотите достичь, и дали нам свалку кода. Не работает ли код? Если нет, то какие ошибки вы получаете. Если это работает, но не так, как ожидалось, как результат отличается от вашего ожидания? Пожалуйста, уточните свой вопрос. – Chris
Я хочу знать, как я могу вставить новый элемент «» в xml-файл? и как я могу сгенерировать XML-файл в качестве вывода? –
С помощью SAX Filter вы можете модифицировать разобранное дерево, но вы не можете вывести измененный XML-файл. Для лучшего понимания, пожалуйста, обратитесь к этому: http://www.cafeconleche.org/books/xmljava/chapters/ch08.html Наверное, лучший способ - использовать DocumentBuilder - http://docs.oracle.com/javase /1.5.0/docs/api/javax/xml/parsers/DocumentBuilder.html или SAXBuilder - http://www.jdom.org/docs/apidocs/org/jdom2/input/SAXBuilder.html, чтобы добавить элемент после вас создали его. Надеюсь, это помогло. – Mircea