簡體   English   中英

如何將SQL表行與XML名稱空間元素匹配?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM