gpt4 book ai didi

xml - 合并 XML 文档层次结构

转载 作者:数据小太阳 更新时间:2023-10-29 03:01:35 26 4
gpt4 key购买 nike

背景

我正在设计一个 Perl 应用程序,它使用 XML 文件作为配置和设置信息的输入。将有一个文档层次结构,全局数据被更多本地信息覆盖。

我的程序将使用最本地的设置文件调用,该文件将包含更多通用文件的路径。一些本地设置将是绝对的,并且这些设置将在程序中进行硬编码。

初始化任务是从最高级别获取调用设置,读入它们,然后继续到每个级别并将它们合并/加入为单个 XML 文档。

示例数据

Global_layouts_100.xml

<CONFIG>
<GRP1>
<FIELD foo="abs" format="%.4f">QTY</FIELD>
<FIELD default="" format="%.2f">COST</FIELD>
<FIELD default="0" format="%.2f">AMT</FIELD>
<FIELD default="1960-01-01" format="YYYMMDD">TRANDATE</FIELD>
<FIELD>ACCOUNT</FIELD>
<FIELD default="0">ACCT_TYPE</FIELD>
</GRP1>
<GRP2>
<FIELD> 1 </FIELD>
<FIELD> 2 </FIELD>
<FIELD> 3 </FIELD>
</GRP2>
</CONFIG>

Global_properties_100.xml

<CONFIG>
<CUS>
<GRP>GRP1</GRP>
<HDR>CUSTOMER</HDR>
<TLR>TLR${cnt}</TLR>
</CUS>
<XYZ>
<GRP>GRP2</GRP>
<HDR>ACCOUNTS</HDR>
<TLR>TLR${cnt}</TLR>
</XYZ>
</CONFIG>

Global_70.xml

<CONFIG>
<PARENT_SETTINGS>Global_layouts_100</PARENT_SETTINGS>
<PARENT_SETTINGS>Global_properties_100</PARENT_SETTINGS>
<LOOKUPS>
<MAP type="file">
<NAME>ACCT_TYPE_LOOKUP</NAME>
<PATH>${PATH}acct_type.csv</PATH>
<HEADERS>
<COLUMN>ACCT_TYPE</COLUMN>
<COLUMN>SOURCE_VALUE</COLUMN>
</HEADERS>
<KEYS>
<COLUMN>SOURCE_VALUE</COLUMN>
</KEYS>
</MAP>
</LOOKUPS>
</CONFIG>

本地.xml

<CONFIG>
<PARENT_SETTINGS>Global_70</PARENT_SETTINGS>
<BATCH>
<CUS>
<SRCFILE type="csv" delimiter="|">/path/to/src_file</SRCFILE>
<OUTFILE>/path/to/out_file</OUTFILE>
<FIELDS>
<CUSTOMER>&CUSTOMER;</CUSTOMER>
<QTY default="0.0" col="23"></QTY>
<COST format="%.4f" col="21"></COST>
<FEE col="18"></FEE>
</FIELDS>
</CUS>
<XYZ>
<SRCFILE />
<OUTFILE />
<FIELDS>
<FIELD_1 />
<FIELD_2 />
<FIELD_3 />
<FIELD_4 />
<FIELD_5 />
</FIELDS>
</XYZ>
</BATCH>
</CONFIG>

现在,如果给程序以 local.xml 启动并以 CUS 作为参数进行处理,我希望看到这个 XML(或等效的 perl 数据结构):

<CONFIG>
<HDR>CUSTOMER</HDR>
<TLR>TLR${cnt}</TLR>
<SRCFILE type="csv" delimiter="|">/path/to/src_file</SRCFILE>
<OUTFILE>/path/to/out_file</OUTFILE>
<LOOKUPS>
<MAP type="file">
<NAME>ACCT_TYPE_LOOKUP</NAME>
<PATH>${PATH}acct_type.csv</PATH>
<HEADERS>
<COLUMN>ACCT_TYPE</COLUMN>
<COLUMN>SOURCE_VALUE</COLUMN>
</HEADERS>
<KEYS>
<COLUMN>SOURCE_VALUE</COLUMN>
</KEYS>
</MAP>
</LOOKUPS>
<CUS>
<FIELD foo="abs" format="%.4f" default="0.0" col="23">QTY</FIELD>
<FIELD default="" format="%.4f" col="21">COST</FIELD>
<FIELD default="0" format="%.2f">AMT</FIELD>
<FIELD default="1960-01-01" format="YYYMMDD">TRANDATE</FIELD>
<FIELD>ACCOUNT</FIELD>
<FIELD default="0">ACCT_TYPE</FIELD>
<FIELDS>
<CUSTOMER>&CUSTOMER;</CUSTOMER>
<QTY default="0.0" col="23"></QTY>
<COST format="%.4f" col="21"></COST>
<FEE col="18"></FEE>
</FIELDS>
</CUS>
</CONFIG>

并且,如果程序将以 local.xml 开始并以 XYZ 作为参数进行处理,我希望看到这个 XML(或等效的 perl 数据结构):

<CONFIG>
<HDR>ACCOUNTS</HDR>
<TLR>TLR${cnt}</TLR>
<SRCFILE />
<OUTFILE />
<LOOKUPS>
<MAP type="file">
<NAME>ACCT_TYPE_LOOKUP</NAME>
<PATH>${PATH}acct_type.csv</PATH>
<HEADERS>
<COLUMN>ACCT_TYPE</COLUMN>
<COLUMN>SOURCE_VALUE</COLUMN>
</HEADERS>
<KEYS>
<COLUMN>SOURCE_VALUE</COLUMN>
</KEYS>
</MAP>
</LOOKUPS>
<XYZ>
<FIELD> 1 </FIELD>
<FIELD> 2 </FIELD>
<FIELD> 3 </FIELD>
<FIELDS>
<FIELD_1 />
<FIELD_2 />
<FIELD_3 />
<FIELD_4 />
<FIELD_5 />
</FIELDS>
</XYZ>
</CONFIG>

问题

合并这些 XML 文档的最有效方法是什么?

我可以自己用 XML::Simple 返回的数据结构来做,或者我应该使用其他一些 XML 工具?

我希望我的问题足够清楚并且不需要示例 XML 数据。如果您需要查看某些内容,我可以发布一些示例内容。

简单的问题是,合并单个 XML 文档的层次结构的最佳方法是什么?

最佳答案

我可以用一些样本数据给你一个更具体的例子,但在处理这个问题时我倾向于使用 XML::Twig

特别是 - XML::Twig 内置了对 cutpaste 的支持,因此您可以构建一个新的文档树,并保留你想要的元素,按照我想要的顺序。

像这样:

#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig -> parse ( \*DATA );

my $newdoc = XML::Twig -> new ('pretty_print' => 'indented_a');
$newdoc -> set_root ( XML::Twig::Elt -> new ( 'new_root_here' ) );
$newdoc -> set_xml_version ('1.0');
$newdoc -> set_encoding('utf-8');

foreach my $value_elt ( $twig -> findnodes ( '//value' ) ) {
$value_elt -> cut;
$value_elt -> paste ( $newdoc -> root );
}


$newdoc -> print;

__DATA__
<root>
<value>fish</value>
<dont_copy>this thing</dont_copy>
</root>

(还有一个例子: How to I combine data from two XML files into the same structure? )

关于xml - 合并 XML 文档层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32427348/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com