[英]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.