如何拆分串联的 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]
如何将大型串联的 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]