如何将 SQL table 行与 XML 命名空间元素匹配?
How do I match SQL table rows with XML namespace elements?
我已经使用以下 PHP:
成功地将 this XML 文件保存到我的服务器
file_put_contents("test.xml", fopen("http://www.treasury.gov/resource-center/data-chart-center/interest-rates/pages/XmlView.aspx?data=yieldyear&year=2015", 'r'));
现在我正试图将它放入我的数据库中。只是试图通过在 phpMyAdmin GUI 中执行 SQL 来让它工作。我成功设置了以下 table:
CREATE TABLE `test` (
`NEW_DATE` varchar(40) NOT NULL,
`BC_1MONTH` int(11) NULL,
`BC_3MONTH` int(11) NULL,
PRIMARY KEY (`NEW_DATE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
下面的代码运行没有错误,但只是在我的数据库中添加了一个空行。
LOAD XML LOCAL INFILE 'test.xml'
INTO TABLE test
ROWS IDENTIFIED BY '<content>';
我看到 here MySQL 服务器查找与目标 table 的列名称相匹配的字段名称。还提到不需要 XML 文件中的每个字段都与对应的 table 中的列相匹配。没有对应列的字段将被跳过。 我的列名是否因为 XML 前缀和名称空间而与 XML 不匹配,还是我找错了树?
问题展示了如何使用 PHP 引用相同的 XML 元素。显然,使用 registerXPathNamespace()
需要前缀定义才能构建 Xpath:
我需要在 SQL 中构建这样的 Xpath 吗?
当我使用 LIBXML_NSCLEAN 之类的东西保存 XML 时,也许我可以删除 PHP 中的 namespace/prefix 数据;显然这删除了冗余的名称空间声明。什么是多余的?
另一个删除名称空间的选项似乎是 XSL 样式表。每 this 个问题。
解决此问题的最佳方法是什么?
本质上,您的 XML 太复杂(嵌套节点、属性、名称空间),无法使用 LOAD XML
轻松导入 MySQL。如上 link 所示,该语句仅支持三种不同的格式:
<row column1="value1" column2="value2" .../>
<row>
<column1>value1</column1>
<column2>value2</column2>
</row>
<row>
<field name='column1'>value1</field>
<field name='column2'>value2</field>
</row>
因此,您需要将原始 XML 转换为上述格式,当然要与 table 的字段对齐。使用 XSLT 会有很大帮助。作为信息,XSLT 是一种特殊的编程语言,可将 XML 内容重新构造为各种形式以满足最终使用需求。与包括 Java、C#、Python 和 VB 在内的其他通用语言一样,PHP 配备了 XSLT 1.0 处理器。您可能需要启用扩展程序。
XSLT 脚本 (另存为 .xsl 或 .xslt 文件)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:doc="http://www.w3.org/2005/Atom"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
exclude-result-prefixes="doc m d">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- IDENTITY TRANSFORM -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<!-- PARSING NEEDED CONTENT -->
<xsl:template match="doc:entry">
<row>
<NEW_DATE><xsl:value-of select="doc:content/m:properties/d:NEW_DATE"/></NEW_DATE>
<BC_1MONTH><xsl:value-of select="doc:content/m:properties/d:BC_1MONTH"/></BC_1MONTH>
<BC_3MONTH><xsl:value-of select="doc:content/m:properties/d:BC_3MONTH"/></BC_3MONTH>
</row>
</xsl:template>
<!-- REMOVE UNNEEDED NODES -->
<xsl:template match="doc:title|doc:id|doc:update|doc:link|doc:updated"/>
</xsl:stylesheet>
PHP脚本(加载和处理XML和XSL内容)
$doc = new DOMDocument();
// PARSING DIRECTLY FROM WEB PAGE
$doc->load('http://www.treasury.gov/resource-center/data-chart-center/interest-rates/pages/XmlView.aspx?data=yieldyear&year=2015');
$xsl = new DOMDocument;
$xsl->load('XSLTScript.xsl');
// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
// Transform XML source
$newXml = $proc->transformToXML($doc);
// Save output to file
$xmlfile = 'Output.xml';
file_put_contents($xmlfile, $newXml);
XML输出(现在XML内容可以在LOAD中使用XML导入到MySQL)
<?xml version="1.0" encoding="UTF-8"?>
<pre>
<row>
<NEW_DATE>2015-01-02T00:00:00</NEW_DATE>
<BC_1MONTH>0.02</BC_1MONTH>
<BC_3MONTH>0.02</BC_3MONTH>
</row>
<row>
<NEW_DATE>2015-01-05T00:00:00</NEW_DATE>
<BC_1MONTH>0.02</BC_1MONTH>
<BC_3MONTH>0.03</BC_3MONTH>
</row>
<row>
<NEW_DATE>2015-01-06T00:00:00</NEW_DATE>
<BC_1MONTH>0.02</BC_1MONTH>
<BC_3MONTH>0.03</BC_3MONTH>
</row>
...
</pre>
我已经使用以下 PHP:
成功地将 this XML 文件保存到我的服务器file_put_contents("test.xml", fopen("http://www.treasury.gov/resource-center/data-chart-center/interest-rates/pages/XmlView.aspx?data=yieldyear&year=2015", 'r'));
现在我正试图将它放入我的数据库中。只是试图通过在 phpMyAdmin GUI 中执行 SQL 来让它工作。我成功设置了以下 table:
CREATE TABLE `test` (
`NEW_DATE` varchar(40) NOT NULL,
`BC_1MONTH` int(11) NULL,
`BC_3MONTH` int(11) NULL,
PRIMARY KEY (`NEW_DATE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
下面的代码运行没有错误,但只是在我的数据库中添加了一个空行。
LOAD XML LOCAL INFILE 'test.xml'
INTO TABLE test
ROWS IDENTIFIED BY '<content>';
我看到 here MySQL 服务器查找与目标 table 的列名称相匹配的字段名称。还提到不需要 XML 文件中的每个字段都与对应的 table 中的列相匹配。没有对应列的字段将被跳过。 我的列名是否因为 XML 前缀和名称空间而与 XML 不匹配,还是我找错了树?
registerXPathNamespace()
需要前缀定义才能构建 Xpath:
我需要在 SQL 中构建这样的 Xpath 吗?
当我使用 LIBXML_NSCLEAN 之类的东西保存 XML 时,也许我可以删除 PHP 中的 namespace/prefix 数据;显然这删除了冗余的名称空间声明。什么是多余的?
另一个删除名称空间的选项似乎是 XSL 样式表。每 this 个问题。
解决此问题的最佳方法是什么?
本质上,您的 XML 太复杂(嵌套节点、属性、名称空间),无法使用 LOAD XML
轻松导入 MySQL。如上 link 所示,该语句仅支持三种不同的格式:
<row column1="value1" column2="value2" .../>
<row>
<column1>value1</column1>
<column2>value2</column2>
</row>
<row>
<field name='column1'>value1</field>
<field name='column2'>value2</field>
</row>
因此,您需要将原始 XML 转换为上述格式,当然要与 table 的字段对齐。使用 XSLT 会有很大帮助。作为信息,XSLT 是一种特殊的编程语言,可将 XML 内容重新构造为各种形式以满足最终使用需求。与包括 Java、C#、Python 和 VB 在内的其他通用语言一样,PHP 配备了 XSLT 1.0 处理器。您可能需要启用扩展程序。
XSLT 脚本 (另存为 .xsl 或 .xslt 文件)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:doc="http://www.w3.org/2005/Atom"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
exclude-result-prefixes="doc m d">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- IDENTITY TRANSFORM -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<!-- PARSING NEEDED CONTENT -->
<xsl:template match="doc:entry">
<row>
<NEW_DATE><xsl:value-of select="doc:content/m:properties/d:NEW_DATE"/></NEW_DATE>
<BC_1MONTH><xsl:value-of select="doc:content/m:properties/d:BC_1MONTH"/></BC_1MONTH>
<BC_3MONTH><xsl:value-of select="doc:content/m:properties/d:BC_3MONTH"/></BC_3MONTH>
</row>
</xsl:template>
<!-- REMOVE UNNEEDED NODES -->
<xsl:template match="doc:title|doc:id|doc:update|doc:link|doc:updated"/>
</xsl:stylesheet>
PHP脚本(加载和处理XML和XSL内容)
$doc = new DOMDocument();
// PARSING DIRECTLY FROM WEB PAGE
$doc->load('http://www.treasury.gov/resource-center/data-chart-center/interest-rates/pages/XmlView.aspx?data=yieldyear&year=2015');
$xsl = new DOMDocument;
$xsl->load('XSLTScript.xsl');
// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
// Transform XML source
$newXml = $proc->transformToXML($doc);
// Save output to file
$xmlfile = 'Output.xml';
file_put_contents($xmlfile, $newXml);
XML输出(现在XML内容可以在LOAD中使用XML导入到MySQL)
<?xml version="1.0" encoding="UTF-8"?>
<pre>
<row>
<NEW_DATE>2015-01-02T00:00:00</NEW_DATE>
<BC_1MONTH>0.02</BC_1MONTH>
<BC_3MONTH>0.02</BC_3MONTH>
</row>
<row>
<NEW_DATE>2015-01-05T00:00:00</NEW_DATE>
<BC_1MONTH>0.02</BC_1MONTH>
<BC_3MONTH>0.03</BC_3MONTH>
</row>
<row>
<NEW_DATE>2015-01-06T00:00:00</NEW_DATE>
<BC_1MONTH>0.02</BC_1MONTH>
<BC_3MONTH>0.03</BC_3MONTH>
</row>
...
</pre>