php - 使用 MySQL 数据库中存储为文本的路径访问嵌套 XML 节点

标签 php mysql xml phpmyadmin

我正在解析多个 XML 文件。所需节点的路径已存储在我的 MySQL 数据库中,以便于访问。

未嵌套的路径不会产生问题。但是当我存储像“fields->sub_category”这样的路径时,“->”选择器似乎有问题。当我在代码中逐字写入路径时,它可以工作,但是当我从数据库中检索字符串并将其用作变量时,它无法工作。当它来自数据库时,为什么我不能使用此语法作为变量?

使用 phpmyadmin,我尝试将索引属性从 varchar 更改为 text,更改排序规则等,但无济于事。

我还尝试存储像“类别子类别”这样的路径,而不使用“->”,并使用 str_replace 将其添加到中间。这也是行不通的。

$nodes = $connect->prepare("SELECT * FROM table");
$nodes->execute();
$node = $nodes->fetch(PDO::FETCH_ASSOC);
$title_node = $node['title']; //value is 'name'
$category_node = $node['subcategory']; //value is 'fields->sub_category'

$feedlink = "http://link.to.myfeed.com/feed.xml";
$x = new XMLReader;
$doc = new DOMDocument;  
$x->open($feedLink);

while ($x->read() && $x->name !== 'product');
while ($x->name == 'product') {

$p = simplexml_import_dom($doc->importNode($x->expand(), true));
echo $p->$title_node; // Actually returns all the titles found
echo $p->$category_node; // Does absolutely nothing
}

我预计

echo $p->$category_node;

将返回该节点内的实际数据,但找不到路径。包含特殊字符“->”的字符串是怎么回事?

这是 XML 结构的简化版本:

<product>
<name>Productname</name>
<price>99.99</price>
<fields>
    <categories>Main category data</categories>
    <color>Black</color>
    <sub_category>Sub category data</sub_category>
</fields>
</product>

最佳答案

在SimpleXML中,你不能随心所欲地使用它......

$category_node = $node['subcategory']; //value is 'fields->sub_category'

正如您稍后提到的,这是因为名称中的 ->,这是 SimpleXML 的限制,每个元素必须是单独的。

为了解决这个问题,您可以使用一种简短的方法来完成此操作,它将节点名称拆分为其组件(使用explode()),然后循环遍历每个组件以更改节点每个级别...

function getNode( $node, $path )    {
    foreach ( explode("->", $path) as $step ) {
        $node = $node->$step;
    }
    return $node;
}

所以而不是

echo $p->$category_node; // Does absolutely nothing

使用...

echo getNode($p, $category_node);

关于php - 使用 MySQL 数据库中存储为文本的路径访问嵌套 XML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54201199/

相关文章:

mysql - 在谷歌地图上显示数据多边形

php - $_SESSION 存储在哪里?

php - 如何使用 jQuery.ajax 和 jScroll 与 PHP 制作无限滚动页面

php - setcookie() 不在谷歌浏览器中设置 cookie

PHP/MySQL - 递增变量名以循环获取数据

mysql - 如何在 MySQL 中将 utf8_general_ci 更改或转换为二进制?

php - 如何在 PHP 中将日期和时间字符串转换为当前时区日期

php - php 文件中出现错误需要一次 __DIR__

c# - 如何在 xml 文件中存储字符串并在 MVC 的_Layout 中使用它

java - 如果条目不存在,则插入到表列中