Извлечение данных из XML с неизвестными полями с помощью PHP - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть лента с несколькими продуктами, но поля неизвестны.Я хочу отобразить «древовидную структуру» из файла с помощью PHP.

XML выглядит следующим образом:

<products>
  <product id="1">
    <title>Title of product 1</title>
    <weight measure="kg">4000</weight>
    <specs>
       <spec name="spec1">
       <value>value spec 1</value>
       <spec name="spec2">
       <value>value spec 2</value>
    </specs>
  </product>
  <product id="2">
    <title>Title of product 2</title>
    <weight measure="kg">10000</weight>
    <specs>
       <spec name="spec1">
       <value>value spec 1</value>
       <spec name="spec2">
       <value>value spec 2</value>
       <spec name="spec3">
       <value>value spec 3</value>
    </specs>
  </product>
</products>

Я бы хотел, чтобы мой PHP отображал что-то вроде этого, чтобы я могМожно вставить эти значения в базу данных:

Product: 1
title: Title of product 1
weight: 4000
spec1: value spec 1
spec2: value spec 2

Product: 2
title: Title of product 2
weight: 10000
spec1: value spec 1
spec2: value spec 2
spec3: value spec 3

Как уже упоминалось, каналы каждый раз по-разному, с разными полями.Это делает его более сложным для меня ..

$xml = simplexml_load_file($feedURL);
foreach($xml->product as $products) {
    echo '>.'.$products[ID].'<br>';
    foreach($products->children() as $properties){
        echo $properties[name].': '.$properties->value.'<br>';
        foreach($properties->children() as $aspects){
            echo '--->'.$aspects[name].': '.$aspects->value.'<br>';
        }
    }
}

Это не работает в данный момент.Как я мог это исправить?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Во-первых, существует проблема с вашим XML, в которой ваши <spec> теги не закрыты должным образом, поэтому simplexml_load_string фактически не будет загружать XML.Вы можете обойти это, используя preg_match например

$xmlstr = file_get_contents($feedURL);
$xml = simplexml_load_string(preg_replace('/(<spec [^>]+)>/', '$1 />', $xmlstr));

Это преобразует что-то вроде:

<spec name="spec1">

в

<spec name="spec1" />

Тогда у вас есть некоторые другие проблемыс вашим кодом.

  1. Вы используете строки без кавычек, например ID, name
  2. Чтобы получить имя простого элемента SimpleXMLE, вы используете $element->getName(), а не $element['name']
  3. Чтобы получить значение SimpleXMLElement, вы просто приводите его к соответствующему типу, например (string)$element not $element->value

Включение отчетов об ошибках показало бы множество этих проблем до вы задали вопрос.Внесение всех этих исправлений в ваш код дает следующий результат:

foreach($xml->product as $products) {
    echo 'Product: '.$products['id']."\n";
    foreach($products->children() as $properties){
        if (!count($properties->children())) echo $properties->getName().': '.(string)$properties."\n";
        foreach($properties->children() as $aspects){
            if ($aspects->getName() == 'spec')
                echo $aspects['name'].': ';
            else
                echo (string)$aspects . "\n";
        }
    }
}

, который дает следующий вывод:

Product: 1 
title: Title of product 1 
weight: 4000 
spec1: value spec 1 
spec2: value spec 2 
Product: 2 
title: Title of product 2 
weight: 10000 
spec1: value spec 1 
spec2: value spec 2 
spec3: value spec 3

Демонстрация на 3v4l.org

0 голосов
/ 31 декабря 2018

Проблема в том, что я скопировал ваш XML-файл, и он не действительно действителен.

http://www.xmlvalidation.com/index.php?id=1&L=2

Вы можете использовать валидатор, и при загрузке файла вы должны получить некоторые ошибки в PHP, что ваш XML-файл недействителен.И когда вы смотрите на свой XML, ваша «спецификация» не совсем верна.

<spec name="spec1">
<value>value spec 1</value>

<spec name="spec2">
<value>value spec 2</value>

<spec name="spec3">
<value>value spec 3</value>

Ваш тег "spec" не закрыт, что вызывает некоторые ошибки.Вы должны закрыть спецификационный тег или сделать его одним тегом.

<spec name="spec2">
    <value>value spec 2</value>
</spec>

Сначала вам следует решить свои проблемы.Тогда вы сможете получить правильные значения.В противном случае, когда вы включите ваши ошибки PHP, вы можете увидеть ошибки, которые XML не является допустимым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...