处理 word 模板 xml 分割问题
以 word 做模板时,文档中的字符串在 xml 中可能被打散到多个节点。
给出上下界字符(比如 {} ),去除中间无用的 dom 节点,使其之间的内容在 xml 中是连续完整的字符串。
用双指针标出上下界后对其中的 dom 节点进行替换。
public static void format(String inPath, String outPath, char beginFlag, char endFlag) throws Exception { InputStream in = new FileInputStream(inPath); OutputStream outputStream = new FileOutputStream(outPath); StringBuilder stringBuilder = new StringBuilder(); byte[] bytes = new byte[1024]; String pre = null; int len = -1; while ((len = in.read(bytes)) != -1) { byte[] bytes2 = new byte[len]; for (int k = 0; k < len; k++) bytes2[k] = bytes[k]; String content = new String(bytes2, "UTF-8"); stringBuilder.append(content); } in.close(); int left = 0, right = 0; while (left < stringBuilder.length()) { if (right > left) { if (stringBuilder.charAt(right) == endFlag) { formatString(stringBuilder, left, right); right++; left = right; } else right++; } else { if (stringBuilder.charAt(left) == beginFlag) right++; else { left++; right++; } } } String s = stringBuilder.toString(); if (s.contains("$")) s = s.replaceAll("\\$", ""); byte[] bytes1 = s.getBytes("UTF-8"); outputStream.write(bytes1, 0, bytes1.length); outputStream.flush(); outputStream.close(); } private static void formatString(StringBuilder stringBuilder, int left, int right) { boolean isDel = false; for (int i = left; i < right; i++) { if (isDel) { if (stringBuilder.charAt(i) == '>') isDel = false; stringBuilder.setCharAt(i, '$'); } else if (stringBuilder.charAt(i) == '<') { stringBuilder.setCharAt(i, '$'); isDel = true; } } }
当你看清人们的真相,于是你知道了,你可以忍受孤独
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2020-04-14 I/O多路复用技术