我正在解析多个XML文件。所需节点的路径已存储在我的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>
答案 0 :(得分:1)
在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);