![](/img/trans.png)
[英]How do i in mysql match all rows in table A with all rows in table b based on the nearest longitude and latitude point?
[英]How do I match SQL table rows with XML namespace elements?
我已使用以下PHP成功将此 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使其正常工作。 我成功设置了下表:
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>';
我在这里看到MySQL服务器正在寻找与目标表的列名匹配的字段名。 还提到了并不需要将XML文件中的每个字段都与对应表中的列进行匹配。 没有相应列的字段将被跳过。 是因为XML前缀和名称空间导致我的列名与XML不匹配,还是我在错误的树上吠叫?
该问题说明如何使用PHP引用相同的XML元素。 显然,使用registerXPathNamespace()
需要前缀定义以构建Xpath:
我是否需要在SQL中构建这样的Xpath?
当我使用LIBXML_NSCLEAN之类的东西将XML保存下来时,也许可以在PHP中删除名称空间/前缀数据; 显然,这删除了多余的名称空间声明。 什么才算多余?
删除名称空间的另一个选择似乎是XSL样式表。 根据这个问题。
解决此问题的最佳方法是什么?
本质上,您的XML太复杂(嵌套节点,属性,名称空间),因此无法使用LOAD XML
轻松导入MySQL。 如您上面的链接所示,该语句仅支持三种不同的格式:
<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转换成上述格式,当然要与表格的字段对齐。 使用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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.