tldr;当我执行下面的LOAD XML语句时,它看起来是成功的,但由于某种原因,lessonName字段总是空的。XML文档中的所有其他字段都能正确加载,但由于某些原因,跳过了这个字段。
我正在尝试使用MySQL将XML文档加载到SQL表中有问题的字段中没有嵌入标签,它没有尝试读取标签的属性;它是一个包含字符串的直接标记跳过的是lessonName字段。下面是我的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 '<p>' paragrah goes here '</p>' should enclose each
paragraph of the lesson-->
<textBody><p> A bunch of stuff related to lesson content is written here...</p>
</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语句时,它看起来是成功的,但由于某种原因,lessonName字段总是空的。所有其他字段都正确加载,但由于某些原因,跳过了此字段。
我花了很多时间试图在SO上寻找答案,但我能找到的只是人们试图用嵌入的节点或不起作用的属性加载节点(显然不是我的问题)。当我执行命令时,没有错误代码或任何东西可以指引我正确的方向,它看起来很成功。我收到以下确认成功的消息:
查询正常,1行受影响(0.002秒)
记录:1已删除:0已跳过:0警告:0
当我执行"SELECT*FROM LESSON;"为了确认我的记录已加载,lessonName列为空,但所有其他字段都是我所期望的。
我快速搜索了与LOAD XML功能相关的错误,我的怀疑得到了证实。LOADXML特性可能没有(好吧,最初没有)使用适当的XML解析器来解析输入。将这些错误视为证据:
https://bugs.mysql.com/bug.php?id=86916
https://bugs.mysql.com/bug.php?id=84245
结论:这可能是MySQL XML LOAD特性中的一个错误。
所以我解决了我的问题,但如果有人想启发我,我仍然不理解这个问题。我删除了XML文档中lessonName标记后的注释,并很好地加载了它。由于某种原因,注释导致跳过标记?
如果有人理解为什么这是一个问题,我很乐意听到!我不能在需要加载到SQL表的XML文档中使用注释,这看起来很傻?我将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><p> A bunch of stuff related to lesson content is written here...</p>
</textBody>
</row>
</Lesson:LessonContent>