将 XML 文件导入数据库,但转义一些 XML 标签

问题描述 投票:0回答:2

我能够使用以下查询成功将 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”列中?

mysql xml mariadb
2个回答
0
投票

我不熟悉将 XML 直接加载到数据库中(作为 XML 而不是文本/blob)。然而,转换这些线路并不一定那么困难。这是一个 Perl 脚本,它将把所有

<t>
</t>
标签分别更改为
&lt;t>
&lt;/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>\&lt;t>$5\&lt;/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

确保您的源文件与脚本位于同一目录中 - 首先保留备份总是明智的,以防万一。


0
投票

您可以尝试使用SmartXML。检查此示例:https://redata.dev/smartxml/docs/type-conversion-in-xml-documents.html

  1. 您需要创建表格结构
  2. 比从 UI 生成解析规则
  3. 如果您需要复杂的处理,您可以尝试使用内置语法
© www.soinside.com 2019 - 2024. All rights reserved.