我能够使用以下查询成功将 XML 文件导入到数据库中的表中:
LOAD XML
INFILE "myFileName.xml"
INTO TABLE t_orig2
ROWS IDENTIFIED BY '<verse>';
当我的 XML 结构如下时,这才有效:
<verse id="40001001"><b>40</b><c>1</c><v>1</v><t>Text content here</verse>
结果是数据很好地插入到我的包含这些列的表中:
id, b, c, v, t
问题是现在我需要将一些实际的 XML 标签插入到数据库中的“t”列中,但导入失败。我的问题是:如何指示 XML 的某些部分不应进入其自己的列(但应将其解释为纯文本)?
这是有问题的 XML 的示例:
<verse id="40001001"><b>40</b><c>1</c><v>1</v><t>
<w pos="N-" morph="----NSF-" lemma="βίβλος" strongs="00976">Βίβλος</w> <w pos="N-" morph="----GSF-" lemma="γένεσις" strongs="01078">γενέσεως</w> <w pos="N-" morph="----GSM-" lemma="Ἰησοῦς" strongs="02424">Ἰησοῦ</w> <w pos="N-" morph="----GSM-" lemma="Χριστός" strongs="05547">χριστοῦ</w> <w pos="N-" morph="----GSM-" lemma="υἱός" strongs="05207">υἱοῦ</w> <w pos="N-" morph="----GSM-" lemma="Δαυίδ">Δαυὶδ</w> <w pos="N-" morph="----GSM-" lemma="υἱός" strongs="05207">υἱοῦ</w> <w pos="N-" morph="----GSM-" lemma="Ἀβραάμ" strongs="00011">Ἀβραάμ</w>.
</t></verse>
我在寻找最终结果,其中“id”,“b”,“c”和“v”进入数据库中自己的列(效果很好),但是“t”标签内的所有内容都应该是作为一个长字符串放入数据库中的“t”列。
我应该如何转义
<t></t>
标签内的 XML,以便导入器将其作为一个长字符串插入到“t”列中?
我不熟悉将 XML 直接加载到数据库中(作为 XML 而不是文本/blob)。然而,转换这些线路并不一定那么困难。这是一个 Perl 脚本,它将把所有
<t>
和 </t>
标签分别更改为 <t>
和 </t>
——您也可以调整脚本来更改其他方面。
#!/usr/bin/perl
use strict;
use warnings;
#IF THESE NEXT TWO LINES RAISE ERRORS, YOU COULD TRY
#JUST COMMENTING THEM OUT (PUT A '#' IN FRONT OF THEM)
#THEY MAY NOT BE NEEDED, DEPENDING ON YOUR PERL SETUP
use feature 'unicode_strings';
use open ':encoding(utf8)'; # deal with all files in a UTF8 way
#https://perldoc.perl.org/perlunifaq.html
binmode STDOUT, ':utf8';
my @data = ();
my $sourcefile = 'source_file.txt'; #FILE TO BE READ
my $targetfile = 'target_file.txt'; #IF EXISTS, THIS FILE WILL BE OVERWRITTEN!
my $longline = '';
#READ THE SOURCE FILE INTO MEMORY
open SOURCE, "<$sourcefile" or die "Cannot open $sourcefile $!\n";
@data = <SOURCE>;
close SOURCE;
print "There are ".scalar @data." lines to process in the file.\n";
#PROCESS THE SOURCE FILE ONE LINE AT A TIME
foreach my $line (@data) {
$longline .= $line;
}
#REPLACE CARRIAGE RETURNS WITH SPACES
$longline =~ s/\n|\r/ /g;
$longline =~ s~
<verse\sid="([^"]+)">
<b>([^<]+)</b>
<c>([^<]+)</c>
<v>([^<]+)</v>
<t>(.*?)</t>
</verse>
~<verse id="$1"><b>$2</b><c>$3</c><v>$4</v>\<t>$5\</t></verse>~xg;
#THE /x FLAG IS REQUIRED TO IGNORE MOST WHITESPACE,
#MAKING THE ABOVE MORE READABLE. THE /g MAKES THE
#REPLACEMENT "GLOBAL", AND IF THE FILE IS ALL ON ONE
#LINE, IT MAY STILL DO ALL OF THE REQUIRED SUBSTITUTIONS.
#ADD CARRIAGE RETURNS BACK IN FOLLOWING </verse> TAGS
#IF ON WINDOWS, YOU MAY NEED \r\n INSTEAD OF \n.
$longline =~ s~(</verse>)\s*~$1\n~g;
open TARGET, ">$targetfile" or die "Cannot open $targetfile. $!\n";
print TARGET $longline;
close TARGET;
print "Script completed.\n";
print "You should now have one verse per line in $targetfile.\n\n";
exit;
要在安装了 perl 的计算机上运行脚本,只需将其保存为文件名,例如“xml_fix_script.pl”,然后像这样运行它:
perl xml_fix_script.pl
确保您的源文件与脚本位于同一目录中 - 首先保留备份总是明智的,以防万一。
您可以尝试使用SmartXML。检查此示例:https://redata.dev/smartxml/docs/type-conversion-in-xml-documents.html