如何使用SAX在1个类中一次解析2个xml文件

问题描述 投票:0回答:1

我如何“强制”解析器方法使用第二个文件并制作第二个映射? 我为1个文件做了一个xml解析和maping(LinkedHashMap)。 如何为其他文件执行相同的操作?

在我的代码中,你可以找到2个解析器实例,2个linkedHashMap。 但方法只使用1个文件,因为我不知道如何指向使用其他文件的方法。

到目前为止我的代码是:

package xml_strings;

import java.util.LinkedHashMap;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ReadingResourcesWithSax {

	static LinkedHashMap<String, String> mapaEn = new LinkedHashMap<String, String>();
	static LinkedHashMap<String, String> mapaPl = new LinkedHashMap<String, String>();

	public static void main(String[] args) throws Exception {
		XmlHandler xmlHandler = new XmlHandler();
		SAXParserFactory factory = SAXParserFactory.newInstance();
		
		SAXParser saxParser = factory.newSAXParser();
		saxParser.parse("strings1.xml", xmlHandler);

		 SAXParser saxParser1 = factory.newSAXParser();
		 saxParser1.parse("strings2.xml", xmlHandler);

		for (String key : mapaEn.keySet()) {
			System.out.print(key + "\n");
			System.out.println("<" + mapaEn.get(key) + ">\n");
		}
	}

	private static class XmlHandler extends DefaultHandler {
		private boolean insideStringItem;
		private String a, b, c;
		private int i = 0;

		@Override
		public void startElement(String uri, String localName, String qName, Attributes attributes)
				throws SAXException {
			if (qName.equals("string")) {
				insideStringItem = true;
				a = attributes.getValue("name");
			}

			else if (qName.equals("string-array")) {
				insideStringItem = true;
				a = attributes.getValue("name");
				c = a;
			} else if (qName.equals("item")) {
				insideStringItem = true;
				a = c + "###" + i;
				i++;
			}
		}

		@Override
		public void characters(char[] ch, int start, int length) throws SAXException {
			if (insideStringItem) {

				insideStringItem = false;
				b = new String(ch, start, length);
				mapaEn.put(a, b);
			}
		}

		@Override
		public void endElement(String uri, String localName, String qName) throws SAXException {
			if (qName.equals("string-array")) {
				i = 0;
			}
		}
	}
}
java xml sax
1个回答
0
投票

好吧,我想通了,也许其他人会寻找那个解决方案 使用相同的处理程序和相同的方法在一次解析许多文件:)

package xml_strings;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ReadingResourcesWithSax {

	static Map<String, String> mapaEn = new LinkedHashMap<String, String>();
	static Map<String, String> mapaPl = new LinkedHashMap<String, String>();

	public static void main(String[] args) throws Exception {
		XmlHandler xmlHandler = new XmlHandler();
		xmlHandler.setMap(mapaEn);
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser saxParser = factory.newSAXParser(); 
		saxParser.parse("stringsEn.xml", xmlHandler);
		
		XmlHandler xmlHandler1 = new XmlHandler();
		xmlHandler1.setMap(mapaPl);
		SAXParserFactory factory1 = SAXParserFactory.newInstance();
		SAXParser saxParser1 = factory1.newSAXParser(); 
		saxParser1.parse("stringsPl.xml", xmlHandler1);


		for (String key : mapaEn.keySet()) {
			System.out.print(key + "\n");
			System.out.println("<" + mapaEn.get(key) + ">\n");
		}

		for (String key : mapaPl.keySet()) {
			System.out.print(key + "\n");
			System.out.println("<" + mapaPl.get(key) + ">\n");
		}
		  List<Map<String, String>> listaMap = new ArrayList<Map<String, String>>();
		  listaMap.add(mapaEn); 
		  listaMap.add(mapaPl);
		  
		  Set<String> keySet = listaMap.get(0).keySet();
		  for(String key: keySet)
		  {
			  System.out.println(key);
			  for(Map<String, String> map: listaMap)
			  {
				  System.out.println("\t"+map.get(key));
			  }
		  }
		  for(Map<String, String> lista : listaMap) {
			  System.out.println("Wartosci dla tego samego klucza :  " + lista.get("type_not_saved"));
		  }
	}

	private static class XmlHandler extends DefaultHandler {
		private Map<String, String> map;
		private boolean insideStringItem;
		private String a, b, c;
		private int i = 0;

		public void setMap(Map<String, String> map)
		{
			this.map = map;
		}
		
		public Map<String, String> getMap()
		{
			return map;
		}
		
		@Override
		public void startElement(String uri, String localName, String qName, Attributes attributes)
				throws SAXException {
			if (qName.equals("string")) {
				insideStringItem = true;
				a = attributes.getValue("name");
			}

			else if (qName.equals("string-array")) {
				insideStringItem = true;
				
				a = attributes.getValue("name");
				map.put(a,"string-array");
				c = a;
			} else if (qName.equals("item")) {
				insideStringItem = true;
				a = c + "###" + i;
				i++;
			}
		}

		@Override
		public void characters(char[] ch, int start, int length) throws SAXException {
			if (insideStringItem) {

				insideStringItem = false;
				b = new String(ch, start, length);
				map.put(a, b);
			}
		}

		@Override
		public void endElement(String uri, String localName, String qName) throws SAXException {
			if (qName.equals("string-array")) {
				i = 0;
			}
		}
	}

}
© www.soinside.com 2019 - 2024. All rights reserved.