gpt4 book ai didi

mysql - 如何将 SQL 表行与 XML 命名空间元素进行匹配?

转载 作者:行者123 更新时间:2023-11-29 11:52:40 28 4
gpt4 key购买 nike

我已成功保存this使用以下 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>';

我明白了here MySQL 服务器查找与目标表的列名匹配的字段名。还提到,不要求 XML 文件中的每个字段都与相应表中的列相匹配。没有对应列的字段将被跳过。 由于 XML 前缀和命名空间,我的列名称与 XML 不匹配,还是我找错了树?

This问题显示如何使用 PHP 引用相同的 XML 元素。显然,需要使用 registerXPathNamespace() 定义前缀才能构建 Xpath:

我需要在 SQL 中构建这样的 Xpath 吗?

当我使用 LIBXML_NSCLEAN 保存 XML 时,也许我可以删除 PHP 中的命名空间/前缀数据。 ;显然这删除了多余的命名空间声明。什么才算是多余?

删除 namespace 的另一个选项似乎是 XSL 样式表。每this问题。

解决此问题的最佳方法是什么?

最佳答案

本质上,您的 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输出(现在可以在LOAD XML中使用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>

关于mysql - 如何将 SQL 表行与 XML 命名空间元素进行匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33771883/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com