Программа должна считывать из XML значения определённых тегов и записывать их в файл как поля, разделённые запятыми. | Код | import org.xml.sax.*; import javax.xml.parsers.*; import javax.xml.parsers.SAXParser; import java.io.*; import java.util.*;
public class Transform extends HandlerBase implements DocumentHandler {
//текстовые данные заключенные в соответствующие теги String num, fam, im, ot, document, docSeria, docNum, datavd, inn, kpp, org; //текущий тег String element;
public static void main(String fname[]) { SAXParserFactory saxFactory = SAXParserFactory.newInstance(); saxFactory.setValidating(false); try { SAXParser saxParser = saxFactory.newSAXParser(); saxParser.parse(new File(fname[0]), new Transform()); } catch(SAXParseException ex) { System.out.println("ParseError:" + ex.getMessage()); } catch(SAXException ex) { ex.printStackTrace(); } catch(ParserConfigurationException ex) { ex.printStackTrace(); } catch(IOException ex) { ex.printStackTrace(); } }
public void setDocumentLocator(Locator fname) { System.out.println("start " + fname.getSystemId()); }
public void startDocument() throws SAXException { }
public void startElement(String el_name, AttributeList attr) throws SAXException { }
public void characters(char buf [], int offset, int len) throws SAXException {
Saver saver = new Saver(); String content = null; if (len > 0) { content = new String(buf, offset, len); } if (element.equals("НомервПачке")) { num = content; } else if (element.equals("ИНН")) { inn = content; } else if (element.equals("КПП")) { kpp = content; } else if (element.equals("НаименованиеОрганизации")) { org = content; } saver.write(num, inn, kpp, org); }
public void endDocument() throws SAXException {
}
}
class Saver {
public String num; public String inn; public String kpp; public String org;
public void write(String num, String inn, String kpp, String org) {
this.num = num; this.inn = inn; this.kpp = kpp; this.org = org; HashMap<String, String> dataFromXML = new HashMap(); dataFromXML.put("num", num); dataFromXML.put("inn", inn); dataFromXML.put("kpp", kpp); dataFromXML.put("org", org); FWriter fr = new FWriter(dataFromXML); fr.save(); } }
class FWriter {
File txt; HashMap<String, String> values; FWriter(HashMap<String, String> values) {
txt = new File("data.txt"); this.values = values; }
public void save() { try { PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(txt, true))); String Num = values.get("num"); String Inn = values.get("inn"); String Kpp = values.get("kpp"); String Org = values.get("org"); //условия в if это мои наивные попытки очистить вывод от лишних символов if (Num != null && !"null".equals(Num) && Num != "\n" && !"\n".equals(Num) && Num != "" && !"".equals(Num)) out.print(values.get("num") + ","); if (Inn != null && "null".equals(Inn) && Inn != "\n" && !"\n".equals(Inn) && Inn != "" && !"".equals(Inn)) out.print(values.get("inn") + ","); if (Kpp != null && "null".equals(Kpp) && Kpp != "\n" && !"\n".equals(Kpp) && Kpp != "" && !"".equals(Kpp)) out.print(values.get("kpp") + ","); if (Org != null && "null".equals(Org) && Org != "\n" && !"\n".equals(Org) && Org != "" && !"".equals(Org)) out.print(values.get("org") + ",");
out.close(); } catch(IOException ex) {}; } }
|
Считывать то она считывает, а вот записывает не совсем так как хочется. В файл кроме нужных текстовых значений записываются null и переводы строки. Откуда взялись null в принципе понятно. Метод characters() | Код | public void characters(char buf [], int offset, int len) throws SAXException {
Saver saver = new Saver(); String content = null; if (len > 0) { content = new String(buf, offset, len); } if (element.equals("НомервПачке")) { num = content; } else if (element.equals("ИНН")) { inn = content; } else if (element.equals("КПП")) { kpp = content; } else if (element.equals("НаименованиеОрганизации")) { org = content; } saver.write(num, inn, kpp, org); }
|
вызывается для каждого тега и если он не соответствует условию element.equals("имя_тега"), то saver.write(num, inn, kpp, org) вызывается с аргументами равными null. От null в файле можно избавиться как-то так | Код | public void write(String num, String inn, String kpp, String org) {
this.num = num; this.inn = inn; this.kpp = kpp; this.org = org; if(num == null) num = ""; if(inn == null) inn = ""; if(kpp == null) kpp = ""; if(org == null) org = ""; HashMap<String, String> dataFromXML = new HashMap(); dataFromXML.put("num", num); dataFromXML.put("inn", inn); dataFromXML.put("kpp", kpp); dataFromXML.put("org", org); FWriter fr = new FWriter(dataFromXML); fr.save(); }
|
Допустим избежать записи в файл пустых строк через запятую в случаях когда num = "" и т.д. тоже можно. Но как выловить переводы строки я что-то пока не смог придумать.
|