網路上一堆範例不如自己作一遍還來的了解
直接切入主題,這裡使用DOM來轉換xml,以步驟來說明
Step1.
首先要有xml檔放到assets資料夾中,為了方便整理在assets 資料夾中另外開了一個xmlfiles資料夾,路徑如下
Project/assets/xmlfiles/command_simple_formatter.xml
<?xml version="1.0" encoding="utf-8"?> <commands> <command id="1" enable="true" function_name="function1" type="FLOAT" /> <command id="2" enable="false" function_name="function2" type="FIXED" /> </commands>
Step2.
接著建立對應的資料結構,根據xml中的tag來建立
public class Command { private int mIndex; private String mFunction; private boolean mEnable; private Type mType; public enum Type { FIXED, FLOAT } public void setType(Type type){ mType = type; } public Type getType(){ return mType; } public void setIndex(int index) { mIndex = index; } public void setFunction(String function) { mFunction = function; } public int getIndex() { return mIndex; } public String getFunction() { return mFunction; } public boolean getEnable(){ return mEnable; } public void setEnable(boolean enable){ mEnable = enable; } }
Step3.
接著開始撰寫轉換的本體,這裡我帶入Template Method Pattern, XmlParser為SuperClass,轉換的必要步驟都在此實作,其餘部份在個別SubClass實作
public abstract class XmlParser { private Context mContext; public XmlParser(Context context) { mContext = context; } public final List<?> parserProcess(String xmlFileName) { Document document = prepareParseComponent(xmlFileName); Element root = getXmlBasicRootElement(document); List<?> javaDatas = parseXmlContentToJavaObjects(root); return javaDatas; } private Document prepareParseComponent(String xmlFileName) { DocumentBuilder documentBuilder = getDocumentBuilder(); InputStream inputStream = getXmlInputStream(xmlFileName); Document document = null; try { document = documentBuilder.parse(inputStream); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return document; } protected abstract List<?> parseXmlContentToJavaObjects(Element root); private DocumentBuilder getDocumentBuilder() { DocumentBuilder documentBuilder = null; DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); try { documentBuilder = builderFactory.newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } return documentBuilder; } /** * * @param xmlFileName : xml file need put in assets folder * @return InputStream */ private InputStream getXmlInputStream(String xmlFileName) { AssetManager assetManager = mContext.getAssets(); InputStream inputStream = null; try { inputStream = assetManager.open(xmlFileName); } catch (IOException e) { e.printStackTrace(); } return inputStream; } private Element getXmlBasicRootElement(Document document) { Element root = document.getDocumentElement(); return root; } }
Step4.
建立繼承XmlParser的類別,主要複寫parseXmlContentToJavaObjects方法
public class CommandSimpleXmlParser extends XmlParser { private String mElementName = "command"; private String mId = "id"; private String mFunctionName = "function_name"; private String mEnable = "enable"; private String mType = "type"; public CommandSimpleXmlParser(Context context) { super(context); } @Override protected List<Command> parseXmlContentToJavaObjects(Element root) { NodeList commandNode = root.getElementsByTagName(mElementName); int commandsNodeSize = commandNode.getLength(); return transXmlToCommand(commandNode,commandsNodeSize); } private List<Command> transXmlToCommand(NodeList nodeList,int size){ List<Command> result = new ArrayList<Command>(); for (int i = 0; i < size; ++i) { Command command = new Command(); Element commandElement = (Element) nodeList.item(i); command.setIndex(transXmlIdTagToCommand( commandElement, mId)); command.setFunction(transXmlFunctionNameTagToCommand( commandElement, mFunctionName)); command.setEnable(transXmlEnableTagToCommand( commandElement, mEnable)); command.setUIType(trnasXmlTypeToCommand( commandElement, mType)); result.add(command); command = null; } return result; } private UIType trnasXmlTypeToCommand(Element element,String type){ return Command.Type.valueOf(element.getAttribute(type)); } private int transXmlIdTagToCommand(Element element,String id){ return Integer.valueOf(element.getAttribute(id)); } private String transXmlFunctionNameTagToCommand(Element element,String functionName){ return element.getAttribute(functionName); } private boolean transXmlEnableTagToCommand(Element element,String enable){ return Boolean.valueOf(element.getAttribute(enable)); } }
Step5.
使用轉換
public class XmlParserMainActivity extends Activity { private static final String TAG = "XmlParserMainActivity"; private static final String COMMAND_SIMPLE_XML_FILE_PATH = "xmlfiles/command_simple_formatter.xml"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); examParseSimpleXml(COMMAND_SIMPLE_XML_FILE_PATH); } private void examParseSimpleXml(String xmlFilePath) { XmlParser simpleCommandXmlParser = new CommandSimpleXmlParser(this); List<Command> commands = (List<Command>) simpleCommandXmlParser .parserProcess(xmlFilePath); } }