Android SDK 二次打包替换SDK 合并资源文件public.xml和Ids.xml的合并 并对合并的public.xml 重新进行id赋值

项目代码:https://gitee.com/tanhuanpei88/merge_xml/tree/master/src

逻辑流程:使用的java合并xml

1、使用dom4j-2.1.3.jar 库 解析xml

  public static Document getDocument(String path) throws DocumentException {
        SAXReader reader = new SAXReader();
        return reader.read(path);
    }

    public static List<Element> getElements(String path) throws DocumentException {

        return getDocument(path).getRootElement().elements();
    }

2、获取两个xml resources标签下的所有标签进行对比,然后再对应的母包public.xml位置插入需要合并的标签

 /**
     * 获取两个xml的所有标签
     * 合并两个xml的标签(去除不必要标签)
     * 插入相同的type标签位置
     * @param path1
     * @param path2
     * @param tagName
     */
    public Document mergeXml(String path1, String path2, String tagName) {
        List<Element> list3 = new ArrayList<>();
        List<Element> merageList = new ArrayList<>();
        try {
            List<Element> list1 = getElements(path1);
            List<Element> list2 = getElements(path2);
            merageList.addAll(list1);
            //合并两个xml的标签(去除不必要标签)
            for (Element element : list2) {
                String name = element.attribute("name").getStringValue();
                boolean isFind = false;
                for (Element element2 : list1) {
                    String name2 = element2.attribute("name").getStringValue();
                    isFind = false;
                    if (name.equals(name2)) {
                        isFind = true;
                        break;
                    }
                }
                if (!isFind) {
                    String findName = element.attributeValue("name");
                    //去除一些不要的标签
                    if(!isContainName(findName)){
                        System.out.println("不同的标签:"+findName);
                        list3.add(element);
                    }
                }

            }
            //插入相同的type标签位置
            int index = 0 ;
            for (int i = 0;i<list1.size() ;i++) {
                Element element = list1.get(i);
                String type = element.attribute("type").getStringValue();
                Iterator iterator=list3.iterator();
                while(iterator.hasNext()) {
                    Element element2=(Element) iterator.next();
                    String type2 = element2.attribute("type").getStringValue();
                    String findName = element2.attributeValue("name");
                    if(type.equals(type2)){
                        merageList.add(i + index,element2);
                        System.out.println("插入位置:"+i + index+ "  类型:"+type2+"  名称:"+findName );
                        index++;
                        iterator.remove();

                    }

                }

            }
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return createDocument(tagName, merageList);
    }

3.当public.xml合并完对资源重新赋值(根据资源id生成的规则)

重新赋值的关键代码:

 /**
     * 创建xml 并且对资源重新赋值
     * @param tagName
     * @param list
     * @return
     */
    public Document createDocument(String tagName, List<Element> list) {
        Document document = DocumentHelper.createDocument();
        Element tagNameElement = document.addElement(tagName);
        String temptType = "";
        String tempId = "7f000000";
        String elementId = "0x7f000000";
        for (Element element : list) {
            //获取type属性值
            String typeName = element.attribute("type").getStringValue();
            long idvalue;
            //上一个值和当前值不一样 那就是新的type类型
            if(!temptType.equals(typeName)){
                tempId  = "7f"+tempId.substring(2,4) +"0000";
                idvalue = Integer.parseInt(tempId, 16);
                tempId = Long.toHexString(65536 + idvalue);
                elementId   = "0x"+tempId;
            }else{
                idvalue = Integer.parseInt(tempId, 16);
                tempId = Long.toHexString(1 + idvalue);
                elementId   = "0x"+tempId;
            }
            temptType = typeName;
            tagNameElement.addElement("public")
                    .addAttribute("type",element.attributeValue("type"))
                    .addAttribute("name",element.attributeValue("name"))
                    .addAttribute("id",elementId);

        }
        return document;
    }

5.输出文档的关键代码:

 /* 输出xml文档
     * @param doc 要输出的文档
     * @param fileName 路径
     */
    public void writeXML(Document doc, String fileName) {
        try {
            // 设置XML文档格式
            OutputFormat outputFormat = OutputFormat.createPrettyPrint();
            // 设置XML编码方式,即是用指定的编码方式保存XML文档到字符串(String),这里也可以指定为GBK或是ISO8859-1  
            outputFormat.setEncoding("UTF-8");
            //outputFormat.setSuppressDeclaration(true); //是否生产xml头
            outputFormat.setIndent(true); //设置是否缩进
            outputFormat.setIndent("    "); //以四个空格方式实现缩进
            outputFormat.setNewlines(true); //设置是否换行

            XMLWriter writer = new XMLWriter(new FileWriter(fileName),outputFormat);
            writer.write(doc);
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

运行:

//母包xml
	        String matrixPublic = "src/public/matrixPublic.xml";
	        //要被合并的xml
	        String channelPublic = "src/public/channelPublic.xml";
	        //输出的xml		
	        final String publicPath = "src/public/public.xml";
	        PublicXML ux = new PublicXML();
	        Document doc=ux.mergeXml(matrixPublic, channelPublic, "resources");
	        ux.writeXML(doc, publicPath);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值