Android开发中关于2个Xml合并问题的实例详解

方法一:dom4j处理xml

import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;  * 合并并输出2个xml文档,所需要jar:dom4j-1.6.1.jar,jaxen-1.1.1.jar * 将某个xml文档的某个标签下或该标签上一级下所有内容插入到另一个xml文档的某个标签下 * @date 2011-04-13 * @author RobotJi * @version 1.0 public class UniteXML {  public UniteXML() {}    * 根据is获取doc,这里的is可以是本地流或者网络流  * @param is  * @return   public static Document getDocument(InputStream is){  Document doc=null;   try {    doc=new SAXReader().read(is);   } catch (DocumentException e) {    e.printStackTrace();   }    return doc; } public static InputStream getInputStream(String path){  File f=new File(path);  if(!f.exists()){   return null;  }  InputStream is=null;  try {   is = new FileInputStream(f);  } catch (FileNotFoundException e) {   e.printStackTrace();  }  return is; }    * 获取子Element  * @param doc 要获取的文档  * @param tagName 文档对应的标签  * @return   public Element getSubElement(Document doc,String tagName){  Element el=(Element)doc.selectSingleNode("//"+tagName);  return el; }    * 输出xml文档  * @param doc 要输出的文档  * @param fileName 路径   public void writeXML(Document doc,String fileName){  try {   XMLWriter writer=new XMLWriter(new FileWriter(fileName));   writer.write(doc);   writer.flush();   writer.close();  } catch (IOException e) {   e.printStackTrace();  } }    * 合并doc  * @param path1 主文档  * @param path2 被合并的文档  * @param tagName1 在主文档中要插入的标签  * @param tagName2 被合并文档的标签  * @param isContain 是否包含被合并文档标签的上一级标签下的所有结点  * @return   public Document unitXMl(String path1,String path2,String tagName1,String tagName2,boolean isContain){  Document doc1=getDocument(getInputStream(path1));  Document doc2=getDocument(getInputStream(path2));      Element elSub2=getSubElement(doc2,tagName2);  Element elSub1=getSubElement(doc1,tagName1);    if(isContain){//   doc1.getRootElement().appendContent(elSub2.getParent());//直接插入的根标签下   elSub1.appendContent(elSub2.getParent());//插入到tagName1标签下  }else{//   doc1.getRootElement().appendContent(elSub2);   elSub1.appendContent(elSub2);  }  return doc1; }  public static void main(String[] args) {  UniteXML ux=new UniteXML();//将c标签下所有内容插入到aa标签下,若参数设为true则可将c标签上一级下的所有内容插入到aa标签下  Document doc=ux.unitXMl("F:testa.xml", "F:testb.xml", "aa", "c", false);    ux.writeXML(doc, "F:testa_test.xml"); }}

//测试用的2个xml如下:

a.xml

Dom4J处理XML,合并2个Xml

Android开发中关于2个Xml合并问题的实例详解

方法二:

import java.io. *; //Java基础包,包含各种IO操作   import java.util. *; //Java基础包,包含各种标准数据结构操作   import javax.xml.parsers. *; //XML解析器接口   import org.w3c.dom. *; //XML的DOM实现   import javax.xml.transform. *;  import javax.xml.transform.dom. *;  import javax.xml.transform.stream. *;    /**  * XML文件合并工具类   * @author GhostFromHeaven  */  public class XMLMergeUtil {            /**      * XML文件的合并处理      * @param mainFileName 待合并处理的xml文件,合并后将更新此文件      * @param subFilename 被合并的xml文件      * @return 合并成功返回true,否则返回false      * @throws Exception      */      public static boolean isMerging(String mainFileName, String subFilename)              throws Exception {          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();          DocumentBuilder db = null;          try {              db = dbf.newDocumentBuilder();          } catch (ParserConfigurationException pce) {              System.err.println(pce); // 出现异常时,输出异常信息          }          Document doc_main = null;          Document doc_vice = null;          // 获取两个XML文件的Document          try {              doc_main = db.parse(mainFileName);              doc_vice = db.parse(subFilename);          } catch (DOMException dom) {              System.err.println(dom.getMessage());          } catch (Exception ioe) {              System.err.println(ioe);          }          // 获取两个文件的根节点                    Element root_main = doc_main.getDocumentElement();          Element root_vice = doc_vice.getDocumentElement();          // 下面添加被合并文件根节点下的每个节点          NodeList messageItems = root_vice.getChildNodes();          int item_number = messageItems.getLength();          // 如果去掉根节点下的第一个节点,那么i从3开始,否则i从1开始          for (int i = 1; i < item_number; i = i + 2) {              // 调用dupliate(),依次复制被合并XML文档中根节点下的节点              Element messageItem = (Element) messageItems.item(i);              dupliate(doc_main, root_main, messageItem);          }          // 调用 write To(),将合并得到的Document写入目标XML文档          boolean isWritten = writeTo(doc_main, mainFileName);          return isWritten;      }            /**      *      * @param doc_dup      * @param father      * @param son      * @return      * @throws Exception      */      private static boolean dupliate(Document doc_dup, Element father, Element son)              throws Exception {          boolean isdone = false;          Element parentElement = null;                    DuplicateChildElementObject childElementObject = isChildElement(father, son);          if(!childElementObject.isNeedDuplicate()){              //节点相同不用合并              isdone = true;              parentElement = childElementObject.getElement();          }else if(childElementObject.getElement() != null){              parentElement = childElementObject.getElement();          }else{              parentElement = father;          }                    String son_name = son.getNodeName();          Element subITEM = null;          if(!isdone){              subITEM = doc_dup.createElement(son_name);              // 复制节点的属性              if (son.hasAttributes()) {                  NamedNodeMap attributes = son.getAttributes();                  for (int i = 0; i < attributes.getLength(); i++) {                      String attribute_name = attributes.item(i).getNodeName();                      String attribute_value = attributes.item(i).getNodeValue();                      subITEM.setAttribute(attribute_name, attribute_value);                  }              }              parentElement.appendChild(subITEM);          }          else{              subITEM = parentElement;          }                    // 复制子结点          NodeList sub_messageItems = son.getChildNodes();          int sub_item_number = sub_messageItems.getLength();          if (sub_item_number < 2) {              // 如果没有子节点,则返回              isdone = true;          } else {              for (int j = 1; j < sub_item_number; j = j + 2) {                  // 如果有子节点,则递归调用本方法                  Element sub_messageItem = (Element) sub_messageItems.item(j);                  isdone = dupliate(doc_dup, subITEM, sub_messageItem);              }          }                              return isdone;      }        private static boolean writeTo(Document doc, String fileName) throws Exception {          boolean isOver = false;          DOMSource doms = new DOMSource(doc);          File f = new File(fileName);          StreamResult sr = new StreamResult(f);          try {              TransformerFactory tf = TransformerFactory.newInstance();              Transformer t = tf.newTransformer();              Properties properties = t.getOutputProperties();              properties.setProperty(OutputKeys.ENCODING, "UTF-8");              t.setOutputProperties(properties);              t.transform(doms, sr);              isOver = true;          } catch (TransformerConfigurationException tce) {              tce.printStackTrace();          } catch (TransformerException te) {              te.printStackTrace();          }          return isOver;      }            private static DuplicateChildElementObject isChildElement(Element father, Element son){                    DuplicateChildElementObject  childElementObject = new DuplicateChildElementObject();                    NodeList messageItems = father.getChildNodes();          int item_number = messageItems.getLength();          //首先遍历所有节点,查找是否有完全相同的节点,防止同一节点已定义多次          for (int i = 1; i < item_number; i = i + 2) {              Element messageItem = (Element) messageItems.item(i);              if(!messageItem.getNodeName().equals(son.getNodeName())){                  continue;              }              if(messageItem.isEqualNode(son)){//同时判断子节点是否一致                  childElementObject.setNeedDuplicate(false);                  childElementObject.setElement(messageItem);                  return childElementObject;              }          }          for (int i = 1; i < item_number; i = i + 2) {              Element messageItem = (Element) messageItems.item(i);              //判断节点是否处于同一级别              if(!messageItem.getNodeName().equals(son.getNodeName())){                  continue;              }              if(isEqualNode(messageItem,son)){//仅判断当前节点是否一致                  if(hasEqualAttributes(messageItem,son)){//当前节点完全相同不需要合并                      childElementObject.setNeedDuplicate(false);                      childElementObject.setElement(messageItem);                      return childElementObject;                  }else{//当前节点的属性不相同,需要合并                      childElementObject.setNeedDuplicate(true);                      childElementObject.setElement(father);                      return childElementObject;                  }              }              }          //目标文档该节点不存在,需要合并到目标文档中          childElementObject.setNeedDuplicate(true);          childElementObject.setElement(father);          return childElementObject;      }            /**      * 判断两个节点是否相同,未判断节点的属性      * @param arg0      * @param arg      * @return      */      private static boolean isEqualNode(Node arg0,Node arg) {          if (arg == arg0) {              return true;          }          if (arg.getNodeType() != arg0.getNodeType()) {              return false;          }            if (arg0.getNodeName() == null) {              if (arg.getNodeName() != null) {                  return false;              }          } else if (!arg0.getNodeName().equals(arg.getNodeName())) {              return false;          }            if (arg0.getLocalName() == null) {              if (arg.getLocalName() != null) {                  return false;              }          } else if (!arg0.getLocalName().equals(arg.getLocalName())) {              return false;          }            if (arg0.getNamespaceURI() == null) {              if (arg.getNamespaceURI() != null) {                  return false;              }          } else if (!arg0.getNamespaceURI().equals(arg.getNamespaceURI())) {              return false;          }            if (arg0.getPrefix() == null) {              if (arg.getPrefix() != null) {                  return false;              }          } else if (!arg0.getPrefix().equals(arg.getPrefix())) {              return false;          }            if (arg0.getNodeValue() == null) {              if (arg.getNodeValue() != null) {                  return false;              }          } else if (!arg0.getNodeValue().equals(arg.getNodeValue())) {              return false;          }          return true;      }            /**      * 判断节点的属性是否相同      * @param arg0      * @param arg      * @return      */      private static boolean hasEqualAttributes(Node arg0,Node arg) {                    NamedNodeMap map1 = arg0.getAttributes();          NamedNodeMap map2 = arg.getAttributes();          int len = map1.getLength();          if (len != map2.getLength()) {              return false;          }                     for (int i = 0; i < len; i++) {               Node n1 = map1.item(i);               if(n1.getNodeName() != null){                    Node n2 = map2.getNamedItem(n1.getNodeName());                    if(n2 == null){                        return false;                    }else if(!n1.getNodeValue().equals(n2.getNodeValue())){                        return false;                    }               }           }           return true;      }      public static void main(String[] args) {          try {                String sourcefile = "d:/a.xml";               String targetfile = "d:/b.xml";                            boolean isdone = XMLMergeUtil.isMerging(sourcefile, targetfile);                            if (isdone)                  System.out.println("XML files have been merged.");              else                  System.out.println("XML files have NOT been merged.");                    } catch (Exception e) {              e.printStackTrace();          }      }  }    /**  * 复制子节点对象  * @author Administrator  *  */  class DuplicateChildElementObject{      private boolean needDuplicate = true;//记录该节点是否需要复制      private Element element = null;//记录该节点的父节点        public DuplicateChildElementObject() {          super();      }        public boolean isNeedDuplicate() {          return needDuplicate;      }        public void setNeedDuplicate(boolean needDuplicate) {          this.needDuplicate = needDuplicate;      }        public Element getElement() {          return element;      }        public void setElement(Element element) {          this.element = element;      }  }

以上就是Android开发中关于2个Xml合并问题的实例详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1429010.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 02:07:09
Facebook RSS能否替代Google Reader?
下一篇 2025年12月17日 02:08:06

相关推荐

  • 悟空浏览器如何彻底清除上网痕迹保护隐私_悟空浏览器清除上网痕迹方法

    清除悟空浏览器上网痕迹需通过隐私设置删除浏览历史、搜索记录、缓存和Cookie,或使用账号与安全功能清除账户关联数据,还可启用无痕浏览模式避免数据留存。 如果您在使用悟空浏览器时希望保护个人隐私,防止他人查看您的浏览活动,则需要彻底清除相关的上网痕迹。这些痕迹包括浏览历史、搜索记录、缓存数据和Coo…

    2026年9月22日
    000
  • 如何配置Android开发环境 Android Studio安装与JDK配置方法

    答案:配置Android开发环境需先安装JDK并设置环境变量,再下载安装Android Studio,配置SDK及虚拟设备,最后创建项目测试。具体步骤包括:1. 安装JDK 17并配置JAVA_HOME和Path;2. 从官网下载Android Studio并安装,自动集成SDK;3. 通过SDK …

    2026年9月22日
    100
  • 拼多多商家版怎么赚钱?拼多多商家版怎么赚钱提现

    答案:通过拼多多商家版开设虚拟资料店铺,缴纳500元保证金注册个人店,选品如PPT模板、教程等高需求低风险商品,利用阿奇索等工具设置自动发货,结合低价引流和付费推广提升销量,订单完成后资金在T+1或T+7结算周期后提现至银行卡。 如果您想通过拼多多商家版实现盈利并完成资金提现,需要了解其核心的运营模…

    2026年9月22日
    400
  • win11安卓子系统(WSA)安装不了怎么办_win11WSA安卓子系统安装失败解决方案

    首先将系统区域更改为美国,然后启用Hyper-V和虚拟机平台功能,接着通过PowerShell安装WSA离线包,若出现依赖错误需先安装Microsoft.UI.Xaml.2.6等组件,最后确保BIOS中已开启CPU虚拟化支持。 如果您尝试在Windows 11上安装安卓子系统(WSA)但遇到失败提示…

    2026年9月22日
    000
  • UC浏览器如何阻止网站获取我的位置_UC浏览器阻止网站定位方法

    首先关闭UC浏览器的位置权限,进入手机设置→应用管理→UC浏览器→权限管理→位置信息→选择禁止;再在UC浏览器内依次点击【我的】→【设置】→【隐私设置】→【个人信息收集管理】→关闭【位置信息】开关;最后通过浏览器设置中的网站权限管理,对特定网站的位置访问权限进行拒绝或删除授权,全面阻止未经允许的位置…

    2026年9月22日
    000
  • 悟空浏览器下载速度慢怎么解决_悟空浏览器下载速度慢提升技巧

    下载慢可优化缓存、网络、后台、多线程及版本。1、清理缓存与数据;2、检查Wi-Fi并优化信号;3、关闭后台应用释放资源;4、开启多线程加速下载;5、更新浏览器至最新版本。 如果您在使用悟空浏览器下载文件时遇到速度缓慢的情况,这可能是由于网络连接不稳定、浏览器缓存堆积或后台资源被大量占用所致。优化相关…

    2026年9月22日
    600
  • 谷歌浏览器安卓版如何清除数据_安卓版Chrome应用数据清理方法

    首先清除浏览数据可解决谷歌浏览器页面加载慢、自动填充错误等问题。通过Chrome设置菜单可一次性清除指定时间范围内的历史记录、Cookie及缓存;针对特定网站问题,可仅清除该站点的数据以保留其他登录状态;若问题严重,可通过手机系统设置中的应用管理清除Chrome的缓存或全部数据,以重置应用状态。 如…

    2026年9月22日
    000
  • 夸克浏览器隐私设置在哪里调整_夸克浏览器隐私设置调整方法

    首先进入夸克浏览器设置菜单调整隐私选项,然后通过启用无痕模式避免浏览记录留存,最后在系统权限与浏览器反跟踪功能中关闭多余权限并开启安全浏览,全面加强隐私保护。 如果您希望在使用夸克浏览器时更好地保护个人隐私,防止数据被追踪或泄露,可以通过调整其内置的隐私设置来实现更安全的浏览体验。 本文运行环境:小…

    2026年9月22日
    200
  • 腾讯动漫VIP会员怎么免费领取_腾讯动漫VIP限时免费领取教程

    可通过官方活动免费领取腾讯动漫VIP。①在腾讯视频APP任务中心用积分兑换,300积分换1天;②关注“腾讯动漫VIP”公众号,发送关键词参与活动获体验卡;③节假日留意APP内“全站限免”活动,直接观看VIP内容或领取免费时长。 如果您希望在不付费的情况下获得腾讯动漫VIP会员的观看权限,可能是因为官…

    2026年9月21日
    000
  • UC浏览器下载时中断了怎么续传_UC浏览器下载任务续传方法

    UC浏览器下载中断后可尝试恢复:首先检查下载管理中暂停或失败的任务并继续;若无效,手动开启断点续传功能重新添加链接;仍无法恢复时,可用ADM等第三方工具接管任务;最后清理UCDownloads目录下的临时文件后重新下载。 如果您在使用UC浏览器下载文件时遇到下载中断的情况,可能是由于网络不稳定或应用…

    2026年9月21日
    200
  • 夸克浏览器加载图片很慢是什么问题_夸克浏览器图片加载慢原因

    图片加载慢可能因网络、省流模式、缓存、安全设置或版本问题导致。1、检查Wi-Fi或移动网络连接,切换至信号更强的5G或稳定Wi-Fi;2、关闭夸克浏览器“省流加速”功能以避免图片压缩;3、清理“缓存文件”和“图片与文件”释放存储空间;4、暂时禁用广告拦截或安全过滤功能排除误判干扰;5、更新夸克浏览器…

    2026年9月21日
    000
  • Android 中使用同一按钮在不同场景下启动不同 Activity

    本文介绍了如何在 Android 应用中使用同一个按钮,根据不同的应用状态启动不同的 Activity。通过在 Activity 间传递额外数据,并根据这些数据动态设置按钮的点击事件,可以实现灵活的页面跳转逻辑。 在 Android 开发中,经常会遇到需要根据用户操作历史或应用状态,使用同一个按钮触…

    2026年9月21日
    100
  • 番茄免费小说怎么用QQ登录_番茄免费小说QQ登录教程

    首先通过登录界面点击“QQ登录”授权进入,或在账号设置中绑定QQ;若已绑定手机号,则需输入验证码完成验证,最后确认授权即可成功登录。 如果您希望在番茄免费小说中使用QQ账号进行登录,但找不到正确的操作入口或遇到授权问题,可以按照以下方法尝试。这些步骤能帮助您完成账号关联和登录流程。 本文运行环境:小…

    2026年9月21日
    200
  • 悟空浏览器开发者工具的控制台怎么用_悟空浏览器Console控制台使用入门教程

    首先启用悟空浏览器开发者工具并进入Console标签,可查看错误、警告等日志信息,通过过滤功能定位问题;支持执行JavaScript代码实时调试,监控网络请求失败及全局异常,还可清空或保存日志以便分析。 如果您在使用悟空浏览器进行网页开发或调试时,发现页面元素未按预期工作或脚本报错,则可以借助开发者…

    2026年9月21日
    800
  • Android应用中实现游戏循环与UI更新的正确姿势

    本文旨在解决Android应用开发中,开发者尝试使用传统游戏循环(如while(running))导致应用无响应或崩溃的问题。核心内容是阐明Android事件驱动的UI模型,指导开发者如何正确初始化UI组件、设置事件监听器,并通过事件回调机制实现逻辑更新和UI刷新,避免阻塞主线程,确保应用的流畅运行…

    2026年9月21日
    900
  • UC浏览器网页截图工具在哪里_UC浏览器网页截图功能入口

    1、打开UC浏览器点击右上角三点菜单,查找“截屏”选项即可截图;2、部分版本支持双指下滑手势或通过分享功能保存为图片;3、建议更新至最新版以获取完整截图功能。 如果您在浏览网页时需要快速保存当前页面的内容,但找不到UC浏览器的截图功能入口,可能是由于界面更新或功能隐藏导致操作路径不明确。以下是找到并…

    2026年9月21日
    000
  • 使用EventBus实现Android实时速度显示与后台保存教程

    本教程详细介绍了如何在Android应用中实现实时速度的显示与后台保存功能。通过利用前台服务(Foreground Service)获取位置数据,并结合EventBus库实现服务与UI界面(MainActivity)之间的实时数据通信,确保即使应用处于后台或屏幕关闭时,速度数据也能持续更新并显示在用…

    2026年9月21日
    000
  • 卢伟冰:功能手机、智能手机之后 手机行业正进入新周期

    9月4日,小米集团总裁卢伟冰表示,继功能机时代与智能机时代之后,全球手机产业正迈入一个全新时代。 卢伟冰今日在社交平台发文提到:“我从2002年进入手机行业,有幸完整见证了功能手机和智能手机两大发展阶段。如今,AI时代已经到来,整个行业正在酝酿深刻变革,步入全新的发展周期。” 回望过去,功能手机时期…

    2026年9月21日
    200
  • UC浏览器如何将网页内容分享到微信_UC浏览器网页分享至微信教程

    打开UC浏览器进入目标网页,点击右上角三点菜单选择“分享”,在应用列表中点击微信好友或朋友圈并发送;2. 若分享功能异常,可长按地址栏复制链接后粘贴至微信聊天窗口发送;3. 如需分享特定图文内容,可通过电源键加音量减键截图,再从相册选择图片发送给微信联系人。 如果您想将UC浏览器中浏览的网页内容快速…

    2026年9月21日
    000
  • UC浏览器缓存清理失败怎么办 UC浏览器缓存管理优化方法

    先检查权限和存储空间,再用手机自带工具清理缓存文件夹,最后更新或重装UC浏览器解决清理失败问题。 UC浏览器缓存清理失败,通常不是按钮没反应,就是空间没释放。问题可能出在系统权限、文件顽固或设置冲突上。别急着重装,先试试这几个方法,基本能搞定。 检查应用权限与存储状态 如果UC浏览器自己都“进不去”…

    2026年9月21日
    000

发表回复

登录后才能评论
关注微信