Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用MySQL数据库中存储为文本的路径访问嵌套的XML节点_Php_Mysql_Xml_Phpmyadmin - Fatal编程技术网

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

Php 使用MySQL数据库中存储为文本的路径访问嵌套的XML节点,php,mysql,xml,phpmyadmin,Php,Mysql,Xml,Phpmyadmin,我正在解析多个XML文件。所需节点的路径已存储在my MySQL数据库中,以便于访问 没有嵌套的路径不会产生问题。但是当我存储一个类似“fields->sub_category”的路径时,“->”选择器似乎有问题。当我真的在代码中写入路径时,它可以工作,但当我从数据库中检索字符串并将其用作变量时,它无法工作。当这个语法来自数据库时,为什么不能使用它作为变量 使用phpmyadmin,我尝试将索引属性从varchar更改为text,更改排序规则等,但没有效果 我还尝试存储类似于“category

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

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

使用phpmyadmin,我尝试将索引属性从varchar更改为text,更改排序规则等,但没有效果

我还尝试存储类似于“category subcategory”的路径,不带“->”,并使用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>

产品名称
99.99
主要类别数据
黑色
子类别数据

在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);

我已经添加了基本结构。我认为这不会有多大区别,因为“硬编码”到节点的路径可以正常工作,但是从数据库中检索路径并将其分配给变量却不行//值为“name”