加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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文件的不同(和合法)格式化可能导致此脚本处理中的错误.

正如您将注意到的,整个脚本中没有下一个.这是故意的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读