Преобразование статических файлов в записи MySQL - PullRequest
0 голосов
/ 20 февраля 2009

Я конвертирую около 4000 текстовых файлов, содержащих HTML, в записи базы данных MySQL. Кажется, что простой способ сделать это - добавить пару строк в HTML, чтобы они отображались в виде файлов XML, а затем XSLT XML в операторы MySQL INSERT. (Построение CSV также будет работать, но менее оптимально, ИМХО). Я пытался сделать это, но мне немного не повезло, чтобы мой XSL играл хорошо.

Я использую Windoze, но могу подключиться через SSH к моему веб-хосту и запустить PHP, может быть, Perl. Хотелось бы максимально автоматизировать это. Я могу достаточно легко составить список файлов и вставить его в скрипт.

Шаблон имени файла: ab12345.html (числовая часть варьируется от 3 до 6 цифр)

Пример содержимого имени файла - это весь файл, в нем нет нижних колонтитулов / заголовков HTML:

<div class="abEntry"><a name="top"><img width="1" height="1" src="images/common/blank.gif"/></a><div id="abEntryTitle"><div id="abEntryTitleText">What does error note "90210 Cannot Do This Thing" mean?</div></div>
            <div class="abEntryParagraph">This error means your McWhopper drive is frazzled. Read me the number off the modem--thats the little boxy thing attached to the big boxy thing--thanks.</div>
        <div class="abEntryDocumentNumber">ab90210</div>

MySQL столбцы и как я хотел бы, чтобы они отображались обратно на содержимое выше

EntryID = auto increment
title = contents of #abEntryTitleText
content = contents of #abEntryParagraph
lastupdated = curdate
related = "1"
visible = "1"
sortorder = "0"
userid = "1"
views = "0"
posvotes = "1"
negvotes = "0"
score = null
emailed = null
detectrelated = "1"
metakeywords = null
metadescription = contents of #abEntryDocumentNumber
startdate = curdate
enableexpiry = "0"
expirydate = null
featured = "0"
workflowstatus = "auto_approved"

XSL, который я пробовал:

<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform ">
<xsl:output method="html" indent="no"/>
<xsl:template match="/"><xsl:apply-templates/></xsl:template>
<xsl:template match="content">
<xsl:text>INSERT INTO questions (approved, title, description, publishDate) VALUES </xsl:text><xsl:text>(1, </xsl:text><xsl:value-of select="id(abEntryTitleText)"/><xsl:text>, </xsl:text>
<xsl:copy-of select="node()|@*"/>
<xsl:text>, </xsl:text>TODAY<xsl:text>,1, 1)</xsl:text>
</xsl:template>
</xsl:transform>

Ответы [ 2 ]

0 голосов
/ 25 февраля 2009

xslt, который вы ищете для создания оператора вставки из элемента

, будет
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    exclude-result-prefixes="msxsl">

    <xsl:output method="text" indent="no"/>

    <xsl:template match="div[@class='abEntry']">
INSERT INTO questions (approved, title, content, metadescription, publishDate)
VALUES (1, '<xsl:value-of select="normalize-space(*/div[@id='abEntryTitleText']/text())" />', '<xsl:value-of select="normalize-space(div[@class='abEntryParagraph']/text())" />', '<xsl:value-of select="normalize-space(div[@class='abEntryDocumentNumber']/text())" />', TODAY)
    </xsl:template>

</xsl:stylesheet>

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

После этого вам, очевидно, понадобится скрипт или приложение для запуска xstl для каждого файла. Я мог бы написать что-нибудь быстро в .Net, если хотите, но если у вас есть какие-то другие инструменты / возможность написания сценариев, возможно, это будет быстрее использовать.

0 голосов
/ 20 февраля 2009

Я не знаком с xsl, поэтому решил бы эту проблему, используя php DOM . IIRC может анализировать html без надлежащего xml.

Учебное пособие на www.phpro.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...