Shell脚本 – 将xml拆分为多个文件
发布时间:2020-12-15 18:56:52 所属栏目:安全 来源:网络整理
导读:我试图将一个大的xml文件拆分成多个文件,并在AWK脚本中使用了以下代码. /fileItem/ { rfile="fileItem" count ".xml" print "?xml version="1.0" encoding="UTF-8"?" rfile print $0 rfile getline while ($0 !~ "/fileItem" ) { print rfile getline }
我试图将一个大的xml文件拆分成多个文件,并在AWK脚本中使用了以下代码.
/<fileItem>/ { rfile="fileItem" count ".xml" print "<?xml version="1.0" encoding="UTF-8"?>" > rfile print $0 > rfile getline while ($0 !~ "</fileItem>" ) { print > rfile getline } print $0 > rfile close(rfile) count++ } 上面的代码生成一个xml文件列表,其名称为“fileItem_1”,“fileItem_2”,“fileItem3”等. 但是,我希望文件名类似于“item_XXXXX”,其中XXXXX是XML中的一个节点 – 如下所示 <fileItem> <id>12345</id> <name>XXXXX</name> </fileItem> 所以,基本上我希望“id”节点是文件名.
我不会使用getline. (我甚至在AWK书中读到不建议使用它.)我认为,使用全局变量进行状态更简单. (具有全局变量的表达式也可以用于模式中.)
该脚本可能如下所示: 测试系分割xml.awk: /<fileItem>/ { collect = 1 ; buffer = "" ; file = "fileItem_"count".xml" ++count } collect > 0 { if (buffer != "") buffer = buffer"n" buffer = buffer $0 } collect > 0 && /<name>.+</name>/ { # cut "...<name>" i = index($0,"<name>") ; file = substr($0,i + 6) # cut "</name>..." i = index(file,"</name>") ; file = substr(file,1,i - 1) file = file".xml" } /</fileItem>/ { collect = 0; print file print "<?xml version="1.0" encoding="UTF-8"?>" >file print buffer >file } 我为一个小测试准备了一些样本数据: 测试系分割xml.xml: <?xml version="1.0" encoding="UTF-8"?> <top> <some> <fileItem> <id>1</id> <name>X1</name> </fileItem> </some> <fileItem> <id>2</id> <name>X2</name> </fileItem> <fileItem> <id>2</id> <!--name>X2</name--> </fileItem> <any> other input </any> </top> …并获得以下输出: $awk -f test-split-xml.awk test-split-xml.xml X1.xml X2.xml fileItem_2.xml $more X1.xml <?xml version="1.0" encoding="UTF-8"?> <fileItem> <id>1</id> <name>X1</name> </fileItem> $more X2.xml <?xml version="1.0" encoding="UTF-8"?> <fileItem> <id>2</id> <name>X2</name> </fileItem> $more fileItem_2.xml <?xml version="1.0" encoding="UTF-8"?> <fileItem> <id>2</id> <!--name>X2</name--> </fileItem> $ tripleee的评论是合理的.因此,此类处理应限于个人使用,因为XML文件的不同(和合法)格式化可能导致此脚本处理中的错误. 正如您将注意到的,整个脚本中没有下一个.这是故意的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |