Spec-Zone .ru
спецификации, руководства, описания, API

13.2.7. LOAD XML Синтаксис

LOAD XML [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'    [REPLACE | IGNORE]    INTO TABLE [db_name.]tbl_name    [PARTITION (partition_name,...)]    [CHARACTER SET charset_name]    [ROWS IDENTIFIED BY '<tagname>']    [IGNORE number {LINES | ROWS}]    [(column_or_user_var,...)]    [SET col_name = expr,...]

LOAD XML оператор читает данные из XML-файла в таблицу. file_name должен быть дан как литеральная строка. tagname в дополнительном ROWS IDENTIFIED BY пункт должен также быть дан как литеральная строка, и должен быть окружен угловыми скобками (< и >).

LOAD XML действия как дополнение выполнения mysql клиента в режиме вывода XML (то есть, запуская клиент с --xml опция). Чтобы записать данные от таблицы до XML-файла, используйте команду, такую как следующий от системной оболочки:

shell> mysql --xml -e 'SELECT * FROM mytable' >
        file.xml

Чтобы считать файл назад в таблицу, использовать LOAD XML INFILE. По умолчанию, <row> элемент, как полагают, является эквивалентом строки таблицы базы данных; это может быть изменено, используя ROWS IDENTIFIED BY пункт.

Этот оператор поддерживает три различных формата XML:

Все 3 формата могут использоваться в том же самом XML-файле; подпрограмма импорта автоматически обнаруживает формат для каждой строки и интерпретирует это правильно. Теги являются соответствующими основанный на теге или названии атрибута и имени столбца.

Следующие пункты работают по существу тот же самый путь к LOAD XML поскольку они делают для LOAD DATA:

См. Раздел 13.2.6,"LOAD DATA INFILE Синтаксис", для получения дополнительной информации об этих пунктах.

IGNORE number LINES или IGNORE number ROWS пункт вызывает первое number строки в XML-файле, который будет пропущен. Это походит LOAD DATA оператор IGNORE ... LINES пункт.

Чтобы иллюстрировать, как этот оператор используется, предположите, что нам создали таблицу следующим образом:

USE test;CREATE TABLE person (    person_id INT NOT NULL PRIMARY KEY,    fname VARCHAR(40) NULL,    lname VARCHAR(40) NULL,    created TIMESTAMP);

Предположите далее, что эта таблица первоначально пуста.

Теперь предположите, что у нас есть простой XML-файл person.xml, чье содержание как показано здесь:

<?xml version="1.0"?><list>  <person person_id="1" fname="Pekka" lname="Nousiainen"/>  <person person_id="2" fname="Jonas" lname="Oreland"/>  <person person_id="3"><fname>Mikael</fname><lname>Ronström</lname></person>  <person person_id="4"><fname>Lars</fname><lname>Thalmann</lname></person>  <person><field name="person_id">5</field><field name="fname">Tomas</field>  <field name="lname">Ulin</field></person>  <person><field name="person_id">6</field><field name="fname">Martin</field>  <field name="lname">Sköld</field></person></list>

Каждый из допустимых форматов XML, обсужденных ранее, представляется в этом файле в качестве примера.

Импортировать данные в person.xml в person таблица, можно использовать этот оператор:

mysql> LOAD XML LOCAL INFILE
        'person.xml'    ->   INTO TABLE person    ->   ROWS IDENTIFIED BY '<person>';Query OK, 6 rows affected (0.00 sec)Records: 6  Deleted: 0  Skipped: 0  Warnings: 0

Здесь, мы принимаем это person.xml располагается в каталоге данных MySQL. Если файл не может быть найден, следующие ошибочные результаты:

ERROR 2 (HY000): File '/person.xml' not found (Errcode: 2)

ROWS IDENTIFIED BY '<person>' пункт означает что каждый <person> элемент в XML-файле считают эквивалентным строке в таблице, в которую должны быть импортированы данные. В этом случае это person таблица в test база данных.

Как может быть замечен ответом по серверу, 6 строк были импортированы в test.person таблица. Это может быть проверено простым SELECT оператор:

mysql> SELECT * FROM person;+-----------+--------+------------+---------------------+| person_id | fname  | lname      | created             |+-----------+--------+------------+---------------------+|         1 | Pekka  | Nousiainen | 2007-07-13 16:18:47 ||         2 | Jonas  | Oreland    | 2007-07-13 16:18:47 ||         3 | Mikael | Ronström   | 2007-07-13 16:18:47 ||         4 | Lars   | Thalmann   | 2007-07-13 16:18:47 ||         5 | Tomas  | Ulin       | 2007-07-13 16:18:47 ||         6 | Martin | Sköld      | 2007-07-13 16:18:47 |+-----------+--------+------------+---------------------+6 rows in set (0.00 sec)

Это показывает, как утверждено ранее в этом разделе, что любые из 3 разрешенных форматов XML могут появиться в единственном файле и быть считаны в использовании LOAD XML.

Инверсия вышеупомянутой работы — то есть, выводя табличные данные MySQL в XML-файл — может быть выполнена, используя mysql клиент от системной оболочки, как показано здесь:

Отметить

--xml опция заставляет mysql клиент использовать форматирование XML для его вывода; -e опция заставляет клиент сразу выполнить SQL-оператор после опции.

shell> mysql --xml -e "SELECT * FROM test.person"
        > person-dump.xmlshell> cat
        person-dump.xml<?xml version="1.0"?><resultset statement="SELECT * FROM test.person" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  <row>        <field name="person_id">1</field>        <field name="fname">Pekka</field>        <field name="lname">Nousiainen</field>        <field name="created">2007-07-13 16:18:47</field>  </row>  <row>        <field name="person_id">2</field>        <field name="fname">Jonas</field>        <field name="lname">Oreland</field>        <field name="created">2007-07-13 16:18:47</field>  </row>  <row>        <field name="person_id">3</field>        <field name="fname">Mikael</field>        <field name="lname">Ronström</field>        <field name="created">2007-07-13 16:18:47</field>  </row>  <row>        <field name="person_id">4</field>        <field name="fname">Lars</field>        <field name="lname">Thalmann</field>        <field name="created">2007-07-13 16:18:47</field>  </row>  <row>        <field name="person_id">5</field>        <field name="fname">Tomas</field>        <field name="lname">Ulin</field>        <field name="created">2007-07-13 16:18:47</field>  </row>  <row>        <field name="person_id">6</field>        <field name="fname">Martin</field>        <field name="lname">Sköld</field>        <field name="created">2007-07-13 16:18:47</field>  </row></resultset>

Можно проверить, что дамп допустим, создавая копию person и затем импортируя файл дампа в новую таблицу, как это:

mysql> USE test;mysql> CREATE TABLE person2 LIKE person;Query OK, 0 rows affected (0.00 sec)mysql> LOAD XML LOCAL INFILE 'person-dump.xml'    ->   INTO TABLE person2;Query OK, 6 rows affected (0.01 sec)Records: 6  Deleted: 0  Skipped: 0  Warnings: 0mysql> SELECT * FROM person2;+-----------+--------+------------+---------------------+| person_id | fname  | lname      | created             |+-----------+--------+------------+---------------------+|         1 | Pekka  | Nousiainen | 2007-07-13 16:18:47 ||         2 | Jonas  | Oreland    | 2007-07-13 16:18:47 ||         3 | Mikael | Ronström   | 2007-07-13 16:18:47 ||         4 | Lars   | Thalmann   | 2007-07-13 16:18:47 ||         5 | Tomas  | Ulin       | 2007-07-13 16:18:47 ||         6 | Martin | Sköld      | 2007-07-13 16:18:47 |+-----------+--------+------------+---------------------+6 rows in set (0.00 sec)

Используя a ROWS IDENTIFIED BY '<tagname>' пункт, возможно импортировать данные из того же самого XML-файла в таблицы базы данных с различными определениями. Для этого примера предположите, что Вам назвали файл address.xml который содержит следующий XML:

<?xml version="1.0"?><list>  <person person_id="1">    <fname>Robert</fname>    <lname>Jones</lname>    <address address_id="1" street="Mill Creek Road" zip="45365" city="Sidney"/>    <address address_id="2" street="Main Street" zip="28681" city="Taylorsville"/>  </person>  <person person_id="2">    <fname>Mary</fname>    <lname>Smith</lname>    <address address_id="3" street="River Road" zip="80239" city="Denver"/>    <!-- <address address_id="4" street="North Street" zip="37920" city="Knoxville"/> -->  </person></list>

Можно снова использовать test.person таблица как определено ранее в этом разделе, после очистки всех существующих записей от таблицы и затем показа ее структуры как показано здесь:

mysql< TRUNCATE person;Query OK, 0 rows affected (0.04 sec)mysql< SHOW CREATE TABLE person\G*************************** 1. row ***************************       Table: personCreate Table: CREATE TABLE `person` (  `person_id` int(11) NOT NULL,  `fname` varchar(40) DEFAULT NULL,  `lname` varchar(40) DEFAULT NULL,  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  PRIMARY KEY (`person_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin11 row in set (0.00 sec)

Теперь создайте address таблица в test база данных используя следующий CREATE TABLE оператор:

CREATE TABLE address (    address_id INT NOT NULL PRIMARY KEY,    person_id INT NULL,    street VARCHAR(40) NULL,    zip INT NULL,    city VARCHAR(40) NULL,    created TIMESTAMP);

Импортировать данные из XML-файла в person таблица, выполните следующий LOAD XML оператор, который определяет, что строки должны быть определены <person> элемент, как показано здесь;

mysql> LOAD XML LOCAL INFILE
        'address.xml'    ->   INTO TABLE person    ->   ROWS IDENTIFIED BY '<person>';Query OK, 2 rows affected (0.00 sec)Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

Можно проверить, что записи были импортированы, используя a SELECT оператор:

mysql> SELECT * FROM person;+-----------+--------+-------+---------------------+| person_id | fname  | lname | created             |+-----------+--------+-------+---------------------+|         1 | Robert | Jones | 2007-07-24 17:37:06 ||         2 | Mary   | Smith | 2007-07-24 17:37:06 |+-----------+--------+-------+---------------------+2 rows in set (0.00 sec)

Начиная с <address> у элементов в XML-файле нет никаких соответствующих столбцов в person таблица, они пропускаются.

Импортировать данные из <address> элементы в address таблица, используйте LOAD XML оператор, показанный здесь:

mysql> LOAD XML LOCAL INFILE
        'address.xml'    ->   INTO TABLE address    ->   ROWS IDENTIFIED BY '<address>';Query OK, 3 rows affected (0.00 sec)Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

Можно видеть, что данные были импортированы, используя a SELECT оператор, такой как этот:

mysql> SELECT * FROM address;+------------+-----------+-----------------+-------+--------------+---------------------+| address_id | person_id | street          | zip   | city         | created             |+------------+-----------+-----------------+-------+--------------+---------------------+|          1 |         1 | Mill Creek Road | 45365 | Sidney       | 2007-07-24 17:37:37 ||          2 |         1 | Main Street     | 28681 | Taylorsville | 2007-07-24 17:37:37 ||          3 |         2 | River Road      | 80239 | Denver       | 2007-07-24 17:37:37 |+------------+-----------+-----------------+-------+--------------+---------------------+3 rows in set (0.00 sec)

Данные от <address> элемент, который включается в XML-комментарии, не импортируется. Однако, с тех пор есть a person_id столбец в address таблица, значение person_id атрибут от родителя <person> элемент для каждого <address> импортируется в address таблица.

Соображения безопасности. Как с LOAD DATA оператор, передача XML-файла от хоста клиента до узла сервера инициируется сервером MySQL. В теории исправленный сервер мог быть создан, который скажет клиентской программе передавать файл выбора сервера, а не файл, названный клиентом в LOAD XML оператор. Такой сервер мог получить доступ к любому файлу на хосте клиента, к которому у клиентского пользователя есть доступ для чтения.

В Веб-среде клиенты обычно соединяются с MySQL от веб-сервера. Пользователь, который может выполнить любую команду против сервера MySQL, может использовать LOAD XML LOCAL считать любые файлы, к которым у процесса веб-сервера есть доступ для чтения. В этой среде клиент относительно сервера MySQL является фактически веб-сервером, не удаленной программой, выполняемой пользователем, который соединяется с веб-сервером.

Можно отключить загрузку XML-файлов от клиентов, запуская сервер с --local-infile=0 или --local-infile=OFF. Эта опция может также использоваться, запуская mysql клиент, чтобы отключить LOAD XML для продолжительности клиентского сеанса.

Чтобы препятствовать тому, чтобы клиент загрузил XML-файлы из сервера, не предоставляйте FILE полномочие к соответствующей учетной записи пользователя MySQL, или отменяют это полномочие, если у клиентской учетной записи пользователя уже есть это.

Важный

Отмена FILE полномочие (или не предоставление этого во-первых) сохраняет пользователя только от выполнения LOAD XML INFILE оператор (так же как LOAD_FILE() функция; это не препятствует тому, чтобы пользователь выполнился LOAD XML LOCAL INFILE. Чтобы отвергнуть этот оператор, следует запустить сервер или клиент с --local-infile=OFF.

Другими словами, FILE полномочие влияет только, может ли клиент считать файлы на сервере; у этого нет никакого опирания, может ли клиент считать файлы на локальной файловой системе.

Для разделенных таблиц, используя механизмы хранения, которые используют блокировки таблицы, такой как MyISAM, LOAD XML не может сократить блокировки раздела. Это не применяется к таблицам, используя механизмы хранения, которые используют блокировку на уровне строки, такой как InnoDB. Для получения дополнительной информации см. Раздел 18.6.4, "Деля и Блокируя".