如何拆分串联的 xml 文件并使用字符串命名提取的文件

How can I split a concatenated xml file and name the extracted files using strings

如何将大型串联的 xml 文件拆分为单独的 xml 文件,并使用字符串命名文件?

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE type-of-doc SYSTEM "file.dtd" [ ]>
<type-of-doc lang="EN" dtd-version="v1" file="1001-20170101.XML" date="20170101">
</type-of-doc>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE type-of-doc SYSTEM "file.dtd" [ ]>
<type-of-doc lang="EN" dtd-version="v1" file="1002-20170101.XML" date="20170101">
</type-of-doc>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE type-of-doc SYSTEM "file.dtd" [ ]>
<type-of-doc lang="EN" dtd-version="v1" file="1008-20170101.XML" date="20170101">
</type-of-doc>

我想读取字符串 file="xxxx-yyyyyyyy.XML" 并创建名为 xxxx.XML

的输出文件

输出xml个文件:

1001.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE type-of-doc SYSTEM "file.dtd" [ ]>
<type-of-doc lang="EN" dtd-version="v1" file="1001-20170101.XML" date="20170101">
</type-of-doc>

1002.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE type-of-doc SYSTEM "file.dtd" [ ]>
<type-of-doc lang="EN" dtd-version="v1" file="1002-20170101.XML" date="20170101">
</type-of-doc>

1008.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE type-of-doc SYSTEM "file.dtd" [ ]>
<type-of-doc lang="EN" dtd-version="v1" file="1008-20170101.XML" date="20170101">
</type-of-doc>

我的偏好是使用 bash shell 工具,例如 cat、awk、sed 和或 xml 工具,例如 xmllint 或类似工具,并记录标准输出和 stderr 到日志文件。

欣赏方法和可测试的解决方案

考虑以下 gawk 方法(如果您的输入按问题中的方式逐行构建):

awk '/<?xml version/{ getline dt; getline typedoc; 
     if (match(typedoc,/file="([0-9]+)-[^"]+.XML"/,a)) { 
         fn=a[1]".xml"; print [=10=] ORS dt ORS typedoc > fn; next; 
     }}{ print > fn }
' input.xml 2> err.log

结果:

cat 1001.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE type-of-doc SYSTEM "file.dtd" [ ]>
<type-of-doc lang="EN" dtd-version="v1" file="1001-20170101.XML" date="20170101">
</type-of-doc>

cat 1002.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE type-of-doc SYSTEM "file.dtd" [ ]>
<type-of-doc lang="EN" dtd-version="v1" file="1002-20170101.XML" date="20170101">
</type-of-doc>

cat 1008.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE type-of-doc SYSTEM "file.dtd" [ ]>
<type-of-doc lang="EN" dtd-version="v1" file="1008-20170101.XML" date="20170101">
</type-of-doc>

  • /<?xml version/ - 在遇到带有 xml 声明的 /<?xml version/ 行时

  • getline dt; - 使用 <!DOCTYPE

  • 捕获下一行
  • getline typedoc; - 捕获带有起始 type-of-doc 标记的下一行

  • if (match(typedoc,/file="([0-9]+)-[^"]+.XML"/,a)) - 匹配file属性值

  • 第一个捕获组([0-9]+)将分配给第一个数组元素a[1]