当前位置: 首页 > news >正文

网页设计网站制作视频教程织梦模板首页修改教程

网页设计网站制作视频教程,织梦模板首页修改教程,东莞塘厦招聘网最新招聘,陕西省建设业协会网站使用 groovy.util.XmlParser 解析 xml 文件,对文件进行修改(新增标签),然后保存。 是不是 XmlParser 没有提供方法遍历每个节点,难道要自己写? 什么是递归? 不用说,想必都懂得~ …

在这里插入图片描述

使用 groovy.util.XmlParser 解析 xml 文件,对文件进行修改(新增标签),然后保存。

是不是 XmlParser 没有提供方法遍历每个节点,难道要自己写?

什么是递归?

不用说,想必都懂得~

import ***.XmlNodeCallback;
import ***.PluginLog;import org.xml.sax.SAXException;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;
import java.util.List;import javax.xml.parsers.ParserConfigurationException;import groovy.util.Node;
import groovy.util.XmlParser;
import groovy.xml.XmlUtil;public class PluginXmlUtil {/*** * @param xmlFile   需要解析的 xml 文件* @param callback  回调每一个标签 node,可以对 node 进行 CURD* @return*/public static Node parseXml(File xmlFile, XmlNodeCallback callback) {if (CommUtils.isEmptyOrNoExists(xmlFile)) {return null;}try {Node rootNode = new XmlParser().parse(xmlFile);traverseNode(rootNode, callback);return rootNode;} catch (IOException e) {} catch (SAXException e) {} catch (ParserConfigurationException e) {}return null;}/*** * @param node          需要保存的往往是根节点 node(当然保存你想要的任意节点也是可以)* @param targetFile    保存文件* @return*/public static boolean saveNodeToFile(Node node, File targetFile) {if (node == null || targetFile == null) {return false;}try {// 使用 groovy 提供的 xml 序列化工具获得原始字符串String finalContent = XmlUtil.serialize(node);if (CommUtils.isEmptyOrNoExists(finalContent)) {return false;}// 使用 TRUNCATE_EXISTING,如果文件存在,那么截取长度为0(也就是覆盖文件内容),然后写入新内容Files.write(targetFile.toPath(), finalContent.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);return true;} catch (IOException e) {}return false;}/*** 递归会写吧~* * @param rootNode      根节点* @param callback      把每个 node 回调返回给外部,在回调中可操作 node 等*/private static void traverseNode(Node node, XmlNodeCallback callback) {if (node == null) {return;}if (callback != null) {callback.onNode(node);}List<Object> children = node.children();boolean hasChildren = children != null && !children.isEmpty();if (hasChildren) {for (Object child : children) {// 仅遍历 node 类型,因为 children 可存在 String 等,调用递归就不合适了// 比如存在 <name>lf</name>,其中值 lf 也是作为 children 的一个元素,// 目前不对他进行递归(如果需要回调给外部,也可以在 XmlNodeCallback 新增一个接口,通过 callback 回调数据) if (child instanceof Node) {traverseNode((Node) child, callback);} else {PluginLog.d("traverseNode: " + child.getClass() + "  val:" + child);}}}}
}

使用接口,回调每一个递归遍历到的 node,在回调中处理逻辑

public interface XmlNodeCallback {void onNode(Node node);
}

直接使用

  File xmlFile = new File(****)def rootNode = PluginXmlUtil.parseXml(xmlFile, new XmlNodeCallback() {@Overridevoid onNode(Node node) {if (node == null) {return}String nodeName = node.name()String[] nodeAttr = node.attributes()if (CommUtils.isEmptyOrNoExists(nodeName)) {return}PluginLog.d("nodeName:" + nodeName + "  nodeAttr:  " + nodeAttr + " value: " + node.value)// TODO: 2024/1/10  处理你的逻辑}})// 比如,我要在跟节点下面添加一个标签rootNode.append(ArgUtil.genDefaultBaseConfigNode())//然后保存修改def saveSuccess = PluginXmlUtil.saveNodeToFile(rootNode, xmlFile)

默认配置

package ***.utils;import org.xml.sax.SAXException;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import groovy.util.Node;
import groovy.util.XmlParser;public class ArgUtil {public static Node genDefaultBaseConfigNode() throws ParserConfigurationException, SAXException, IOException {return new XmlParser().parseText("<base-config cleartextTrafficPermitted=\"true\">\n" +"        <trust-anchors>\n" +"            <certificates src=\"user\" />\n" +"            <certificates src=\"system\" />\n" +"        </trust-anchors>\n" +"    </base-config>");}public static Node genDefaultTrustAnchorsNode() throws ParserConfigurationException, SAXException, IOException {return new XmlParser().parseText("<trust-anchors>\n" +"            <certificates src=\"user\" />\n" +"            <certificates src=\"system\" />\n" +"        </trust-anchors>");}public static Node genDefaultCertificatesNode(String value) throws ParserConfigurationException, SAXException, IOException {return new XmlParser().parseText("<certificates src=" + value + " />");}
}

学会了新增,删除、修改都不是问题吧~

http://www.yayakq.cn/news/167415/

相关文章:

  • 网站备案 有什么用广州楼市最新消息
  • 青岛网站设计定制安庆市建设银行网站首页
  • 电商网站介绍徐州企业网站建设
  • 做帮助手册的网站学生做兼职的网站
  • 做瓜子进出口用哪些网站携程旅行的网站建设
  • 视频网站的建设目标长沙网站建设服务商
  • 网站建设搭建步骤如何用php数据库做网站
  • 凯里网站建设哪家专业建筑清单网
  • 网站转移烟台做网站
  • 网站规划与设计大作业怎么做0基础1小时网站建设教程
  • 两学一做网站是多少做美剧网站侵权
  • 宁波网站推广服务金蝶在线登录入口
  • 做配资网站网站首页栏目怎么做
  • 手机网站封装小程序浙江建设信息网港
  • 渭南哪家公司可以做网站wordpress添加背景
  • 把手机做网站服务器wordpress description
  • 新媒体网站建设方案wordpress如何双语
  • 网站安全建设模板下载安徽城乡建设厅网站
  • 旺旺号查询网站怎么做网站 框架网页建设
  • 出国看病网站开发欧亚专线快递查询官网
  • 免费手机网站模板下载wordpress商店结算
  • 怎么用linux做网站服务器江西网站建设价格
  • 宣传京津风筝网站的建设目的做网站要钱的吗
  • 12306网站开始是谁开发的用织梦做网站
  • 网站开发工程师前景叫外包公司做网站不肯给源代码的
  • 太仓网站建设企业网站搜索引擎 网站模板
  • 做网站要sql 数据库名字账号密码wordpress常用库
  • 几个网站一个空间 怎么做邮箱高新区建设局网站
  • 怎么做跳转不影响原网站排名网站设计与制作前景
  • 成都网站建设门户厦门工装室内设计公司排名