如何使用 xmlstarlet 合并两个 xml 文件
How to merge two xml files using xmlstarlet
我有两个示例 xml 文件,我想合并其中的元素。
如果我 运行 xmlstarlet sel -t -c "//data" input1.xml input2.xml
,我有两次 data
标签(我知道这是正确的结果),但我只想合并item
个标签,而且只有一个标签。
这是我的输入文件
input1.xml:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<demo:pub xsi:schemaLocation="demo_1_0 demo.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:demo="demo_1_0">
<data>
<item>
<fieldA>12</fieldA>
<fieldB>Hello world</fieldB>
</item>
<item>
<fieldA>15</fieldA>
<fieldB>The book is yellow</fieldB>
</item>
</data>
</demo:pub>
input2.xml:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<demo:pub xsi:schemaLocation="demo_1_0 demo.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:demo="demo_1_0">
<data>
<item>
<fieldA>08</fieldA>
<fieldB>Hello world II</fieldB>
</item>
<item>
<fieldA>06</fieldA>
<fieldB>The book is orange</fieldB>
</item>
</data>
</demo:pub>
我想要这样的东西:
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:demo="demo_1_0">
<item>
<fieldA>12</fieldA>
<fieldB>Hello world</fieldB>
</item>
<item>
<fieldA>15</fieldA>
<fieldB>The book is yellow</fieldB>
</item>
<item>
<fieldA>08</fieldA>
<fieldB>Hello world II</fieldB>
</item>
<item>
<fieldA>06</fieldA>
<fieldB>The book is orange</fieldB>
</item>
</data>
合并两个 XML 文件与 xmlstarlet 和 bash:
echo "<data/>" | xmlstarlet edit \
--insert '//data' --type attr -n 'xmlns:xsi' --value 'http://www.w3.org/2001/XMLSchema-instance' \
--insert '//data' --type attr -n 'xmlns:demo' --value 'demo_1_0' \
--subnode '//data' --type text -n '' --value "$(xmlstarlet select --omit-decl -t --copy-of '//data/item' input1.xml)" \
--subnode '//data' --type text -n '' --value "$(xmlstarlet select --omit-decl -t --copy-of '//data/item' input2.xml)" \
| xmlstarlet unescape \
| xmlstarlet format --omit-decl --nsclean
输出:
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:demo="demo_1_0">
<item>
<fieldA>12</fieldA>
<fieldB>Hello world</fieldB>
</item>
<item>
<fieldA>15</fieldA>
<fieldB>The book is yellow</fieldB>
</item>
<item>
<fieldA>08</fieldA>
<fieldB>Hello world II</fieldB>
</item>
<item>
<fieldA>06</fieldA>
<fieldB>The book is orange</fieldB>
</item>
</data>
参见:xmlstarlet --help
、xmlstarlet edit --help
、xmlstarlet format --help
我有两个示例 xml 文件,我想合并其中的元素。
如果我 运行 xmlstarlet sel -t -c "//data" input1.xml input2.xml
,我有两次 data
标签(我知道这是正确的结果),但我只想合并item
个标签,而且只有一个标签。
这是我的输入文件
input1.xml:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<demo:pub xsi:schemaLocation="demo_1_0 demo.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:demo="demo_1_0">
<data>
<item>
<fieldA>12</fieldA>
<fieldB>Hello world</fieldB>
</item>
<item>
<fieldA>15</fieldA>
<fieldB>The book is yellow</fieldB>
</item>
</data>
</demo:pub>
input2.xml:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<demo:pub xsi:schemaLocation="demo_1_0 demo.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:demo="demo_1_0">
<data>
<item>
<fieldA>08</fieldA>
<fieldB>Hello world II</fieldB>
</item>
<item>
<fieldA>06</fieldA>
<fieldB>The book is orange</fieldB>
</item>
</data>
</demo:pub>
我想要这样的东西:
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:demo="demo_1_0">
<item>
<fieldA>12</fieldA>
<fieldB>Hello world</fieldB>
</item>
<item>
<fieldA>15</fieldA>
<fieldB>The book is yellow</fieldB>
</item>
<item>
<fieldA>08</fieldA>
<fieldB>Hello world II</fieldB>
</item>
<item>
<fieldA>06</fieldA>
<fieldB>The book is orange</fieldB>
</item>
</data>
合并两个 XML 文件与 xmlstarlet 和 bash:
echo "<data/>" | xmlstarlet edit \
--insert '//data' --type attr -n 'xmlns:xsi' --value 'http://www.w3.org/2001/XMLSchema-instance' \
--insert '//data' --type attr -n 'xmlns:demo' --value 'demo_1_0' \
--subnode '//data' --type text -n '' --value "$(xmlstarlet select --omit-decl -t --copy-of '//data/item' input1.xml)" \
--subnode '//data' --type text -n '' --value "$(xmlstarlet select --omit-decl -t --copy-of '//data/item' input2.xml)" \
| xmlstarlet unescape \
| xmlstarlet format --omit-decl --nsclean
输出:
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:demo="demo_1_0">
<item>
<fieldA>12</fieldA>
<fieldB>Hello world</fieldB>
</item>
<item>
<fieldA>15</fieldA>
<fieldB>The book is yellow</fieldB>
</item>
<item>
<fieldA>08</fieldA>
<fieldB>Hello world II</fieldB>
</item>
<item>
<fieldA>06</fieldA>
<fieldB>The book is orange</fieldB>
</item>
</data>
参见:xmlstarlet --help
、xmlstarlet edit --help
、xmlstarlet format --help