LOAD XML 命令导致缺少字段/节点

Posted

技术标签:

【中文标题】LOAD XML 命令导致缺少字段/节点【英文标题】:LOAD XML command results in missing fields/nodes 【发布时间】:2021-11-21 14:23:16 【问题描述】:

tldr;当我执行下面的 LOAD XML 语句时,它看起来很成功,但由于某种原因,课程名称字段始终为空。 XML 文档中的所有其他字段都可以正确加载,但由于某种原因,这个字段被跳过了。

我正在尝试使用 mysql 将 XML 文档加载到 SQL 表中。 有问题的字段中没有嵌入标签,它没有尝试读取标签的属性;它是一个包含字符串的直接标记。 它是被跳过的课程名称字段。下面是我的 XML 文档:

<?xml version = "1.0"?>

<Lesson:LessonContent xmlns:Lesson = "UniqueURIHERE:Lessonv1.0.xsd">

    <row>
        <courseID>COMP466</courseID>
    
        <unitNumber>1</unitNumber>
    
        <unitName>Intro to html</unitName>
    
        <lessonName>Introduction</lessonName>

        <!--The following text '&lt;p&gt;' paragrah goes here '&lt;/p&gt;' should enclose each 
        paragraph of the lesson-->
        <textBody>&lt;p&gt; A bunch of stuff related to lesson content is written here...&lt;/p&gt;
        </textBody>
    </row>
</Lesson:LessonContent>

这是我的 XSD

<?xml version = '1.0'?>

<schema xmlns = "http://www.w3.org/2001/XMLSchema"
        xmlns:Lesson = "UniqueURIHERE:Lessonv1.0.xsd"
        targetNamespace = "UniqueURIHERE:Lessonv1.0.xsd">
        
    <element name = 'LessonContent' type = 'Lesson:root'/>
    
    <complexType name = 'root'>
        <sequence>
            <element name = 'row' type = 'Lesson:row'/>
        </sequence>
    </complexType>
    
    <complexType name = 'row'>
        <sequence>
            <element name = 'courseID' type = 'string'/>
            <element name = 'unitNumber' type = 'float'/>
            <element name = 'unitName' type = 'string'/>
            <element name = 'lessonName' type = 'string'/>
            <element name = 'textBody' type = 'string'/>
        </sequence>
    </complexType>
    
</schema>

这是我用来加载 XML 文档的命令:

LOAD XML INFILE 'Unit1_introToHTML.xml' INTO TABLE LESSON ROWS IDENTIFIED BY '<row>';

这是我正在加载的表的列

SHOW COLUMNS FROM LESSON;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| courseID   | varchar(50)  | NO   | PRI | NULL    |       |
| unitName   | varchar(255) | YES  |     | NULL    |       |
| lessonName | varchar(255) | NO   | PRI | NULL    |       |
| unitNumber | int(11)      | NO   |     | NULL    |       |
| textBody   | text         | NO   |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+
5 rows in set (0.006 sec)

当我执行 LOAD XML 语句时,它显示为成功,但由于某种原因,课程名称字段始终为空。所有其他字段都正确加载,但由于某种原因,这个字段被跳过了。

我花了很多时间试图在 SO 上寻找答案,但我所能找到的只是人们试图加载具有嵌入式节点或属性不起作用的节点(显然不是我的问题)。当我执行命令时,没有错误代码或任何东西甚至可以为我指明正确的方向,它似乎是成功的。我收到以下消息确认成功:

查询正常,1 行受影响(0.002 秒)

记录:1 删除:0 跳过:0 警告:0

当我执行“SELECT * FROM LESSON;”时为了确认我的记录已加载,课程名称列是空的,但所有其他字段都符合我的预期。

【问题讨论】:

【参考方案1】:

我快速搜索了与 LOAD XML 功能相关的错误,我的怀疑得到了证实。 LOAD XML 功能可能不(嗯,最初没有)使用适当的 XML 解析器来解析输入。将这些错误视为证据:

https://bugs.mysql.com/bug.php?id=86916

https://bugs.mysql.com/bug.php?id=84245

结论:这可能是 MySQL XML LOAD 特性中的一个错误。

【讨论】:

【参考方案2】:

所以我解决了我的问题,但如果有人想尝试启发,我仍然不明白这个问题。我在 XML 文档中的 courseName 标记之后删除了 cmets,它加载得很好。出于某种原因,评论导致标签被跳过?

如果有人明白为什么这是一个问题,我很乐意听到!我不能在需要加载到 SQL 表的 XML 文档中使用 cmets 似乎很愚蠢?我将 XML 更改为以下内容(实际上只是删除了评论),现在它很完美。

<?xml version = "1.0"?>

<Lesson:LessonContent xmlns:Lesson = "UniqueURIHERE:Lessonv1.0.xsd">

    <row>
        <courseID>COMP466</courseID>
    
        <unitNumber>1</unitNumber>
    
        <unitName>Intro to HTML</unitName>
    
        <lessonName>Introduction</lessonName>

        <textBody>&lt;p&gt; A bunch of stuff related to lesson content is written here...&lt;/p&gt;
        </textBody>
    </row>
</Lesson:LessonContent>

【讨论】:

以上是关于LOAD XML 命令导致缺少字段/节点的主要内容,如果未能解决你的问题,请参考以下文章

MySQL LOAD XML 在导入时缺少子节点

我需要添加缺少的节点,然后排序包括添加的新节点

asp.net如何获取到xml文件的节点值

如何将 XML 属性转换为文本节点

xml 根据id获取节点 急急急

php如何解析多级xml报文?