将变量内容追加到文件及XML处理脚本优化问询
优化带头尾单行XML的z/OS适配脚本方案
嘿,完全懂你这种心情——手里的脚本明明能正常运行,但总想着能不能把它磨得更精炼、更少冗余环节!针对你处理「带头部+无换行整段XML+尾部」的文件、适配z/OS超长行限制的需求,咱们可以把原来「移除头尾→格式化XML→恢复头尾」的三步流程,优化成一步到位的逻辑,既减少临时文件开销,也让脚本更易维护。
核心优化思路
z/OS的问题只出现在中间的超长XML主体部分,头尾内容本身是符合要求的。所以我们不需要把整个文件拆解开处理,而是直接定位XML主体的起止范围,只对这部分做格式化,头尾原样保留。
具体实现示例(用awk)
awk天生适合处理这种混合格式的文本,能一次性完成识别、处理、输出全流程:
BEGIN { in_xml = 0 # 标记是否进入XML主体 # 替换成你实际使用的XML格式化命令,比如xmllint或者xmlstarlet fmt_cmd = "xmllint --format -" } # 匹配XML主体的起始(请替换成你实际的根标签,比如<Order>) /<root>/ { in_xml = 1 # 截取出当前行里的头部内容并输出,把XML起始部分送入格式化管道 sub(/^.*<root>/, "<root>", $0) print | fmt_cmd next } # 匹配XML主体的结束(对应根标签的闭合标签) /<\/root>/ { in_xml = 0 # 把XML结束部分送入格式化管道,关闭管道后输出尾部内容 sub(/<\/root>.*$/, "</root>", $0) print | fmt_cmd close(fmt_cmd) # 截取出尾部内容并输出 sub(/.*<\/root>/, "", $0) print next } # 处于XML主体内时,把内容直接送入格式化命令 in_xml { print | fmt_cmd } # 不在XML主体内时,直接输出(头部/尾部内容) !in_xml { print }
为什么这比原来的方案更简洁?
- 无中间文件:不需要创建临时文件存储拆出头尾后的XML,通过管道实时处理,减少磁盘IO和清理步骤
- 一步到位:从输入到输出只需要一次命令调用,逻辑紧凑,减少脚本的复杂度
- 灵活性高:只要调整根标签的匹配规则,就能适配不同结构的XML文件;格式化工具也可以轻松替换
小技巧
- 如果你的XML根标签不固定,可以用更通用的匹配规则,比如匹配第一个
<[^!](跳过DOCTYPE)来识别XML起始 - 运行脚本时直接用:
awk -f xml_fix.awk input_file.xml > output_for_zos.xml
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

