Доступ к вложенному узлу XML с использованием пути, хранящегося в виде текста в базе данных MySQL - PullRequest
0 голосов
/ 15 января 2019

Я анализирую несколько файлов XML. Пути к нужным узлам были сохранены в моей базе данных MySQL для легкого доступа.

Пути, которые не являются вложенными, не создают проблем. Но когда я сохраняю путь наподобие 'fields-> sub_category', кажется, возникает проблема с селектором '->'. Когда я буквально пишу путь в коде, он работает, но когда я извлекаю строку из базы данных и использую ее как переменную, она не работает. Почему я не могу использовать этот синтаксис в качестве переменной, когда он поступает из базы данных?

С помощью phpmyadmin я пытался изменить свойства индекса с varchar на текст, изменить параметры сортировки и т. Д., Но безрезультатно.

Я также пытался сохранить путь типа «подкатегория категории» без «->» и добавить его между ними, используя 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>

1 Ответ

0 голосов
/ 15 января 2019

В 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...