如何复制源 XML 文件并在输出中将渐进式数字附加到预定义属性



我有一个XML文件,其中包含一系列组,例如

   <Group id="CB1391262521L-10816-1390650339-936236343" name="This Speed" color="#FFFFFF">
                <Topology>
                    <TopologyRect cylinderHor="false" hcount="1" cylinderVert="false" vcount="1"/>
                </Topology>
                <Name="test">
                    <Parameter value="1" name="ssd"/>
                    <Parameter value="1" name="amp"/>
                </Name>
                <Note></Note>
                <DiagramIcon width="50" x="89" y="392" height="50"/>
</Group>
<Group id="L-14827-1391619839-708665346" name="Angle" color="#FFFFFF">
                <Topology>
                    <TopologyRect cylinderHor="false" hcount="1" cylinderVert="false" vcount="2"/>
                </Topology>
                <Name="test">
                    <Parameter value="3" name="ssd"/>
                    <Parameter value="2" name="amp"/>
                </Name>
                <Note></Note>
                <DiagramIcon width="50" x="89" y="392" height="50"/>
</Group>

和连接,例如

<Connection target="CB1391262521L-10816-1390650339-936236343" type="excitatory" id="L-22494-1391265621-2060625361-1" source="L-14827-1391619839-708665346" name="Connection Reflex->M">
            <Pattern></Pattern>
</Connection>

我想制作一个 unix shell 脚本(例如使用 grep),该脚本复制此文件 N 次,但对于创建的每个副本,将字符串 -01、-02 等(取决于 N)附加到 XML 文件中任何标签的idtargetsource属性中包含的所有值(组, 连接等)。脚本应具有原始.xml文件和所需副本数作为参数,例如

myScript.py OriginalFile.xml 5

其中 5 是副本数,脚本的输出生成 5 个.xml文件,其中第一个文件在 id、目标和源属性中包含的所有值后附加了 -01,第二个文件将有 -02 等...

我认为这是一个正则表达式搜索和替换,不需要在 Python 中解析原始 XML 文件,而只需将其作为普通文本文件逐行读取即可。

纯壳

#!/usr/bin/env bash
xml=$1
n=$2
for i in $(seq $n)
do
  i=$(printf "%02s" $i)
  sed -r "s/((id|target|source)="[^"]+[0-9])/1-$i/g" $xml > $i.xml
done

如何运行

myScript.sh OriginalFile.xml 5

然后你会得到5个XML文件:01.xml, 02.xml, etc.

Python 解决方案:

import re    
n=5    
with open("source.xml","r") as source:
    xml = source.read()
for i in range(n):
    with open("out-%d.xml" % i,"w") as target:
        modxml = re.sub(r'(id|target|source)="([^"]*)"',r'1="2-%d"' % i,xml)
        target.write(modxml) 

相关内容

  • 没有找到相关文章

最新更新