api — чтение php RSS-канал не может прочитать & lt; a10: тип контента = & quot; text / xml & quot; & gt; тег

Я пытаюсь прочитать RSS-канал с помощью php. По какой-то причине он не может прочитать этот тег содержимого.

<a10:content type="text/xml">...</a10:content>

Это пример того, как может выглядеть предмет

<rss version="2.0" xmlns:a10="http://www.w3.org/2005/Atom">
<channel>
<title>mMin title</title>
<description>Some description</description>
<managingEditor>[email protected]</managingEditor>
<category>Some category</category>
<item>
<guid isPermaLink="false">1</guid>
<link>https://example.com/1</link>
<title>Some title 1</title>
<a10:updated>2017-05-30T13:20:22+02:00</a10:updated>
<a10:content type="text/xml">
<Location>San diego</Location>
<PublishedOn>2016-10-21T11:21:07</PublishedOn>
<Body>Lorem ipsum dolar</Body>
<JobCountry>USA</JobCountry>
</a10:content>
</item>
<item>
<guid isPermaLink="false">1</guid>
<link>https://example.com/2</link>
<title>Some title 2</title>
<a10:updated>2017-05-30T13:20:22+02:00</a10:updated>
<a10:content type="text/xml">
<Location>Detroit</Location>
<PublishedOn>2016-10-21T11:21:07</PublishedOn>
<Body>Lorem ipsum dolar</Body>
<JobCountry>USA</JobCountry>
</a10:content>
</item>
<item>
<guid isPermaLink="false">1</guid>
<link>https://example.com/3</link>
<title>Some title 3</title>
<a10:updated>2017-05-30T13:20:22+02:00</a10:updated>
<a10:content type="text/xml">
<Location>Los Angeles</Location>
<PublishedOn>2016-10-21T11:21:07</PublishedOn>
<Body>Lorem ipsum dolar</Body>
<JobCountry>USA</JobCountry>
</a10:content>
</item>
</channel>
</rss>

Вот мой код

    $url = "http://example.com/RSSFeed";
$xml = simplexml_load_file($url);

foreach ($xml->channel as $x) {
foreach ($x->item as $item) {

dd($item);
}
}

Какие выводы

    SimpleXMLElement {#111 ▼
+"guid": "1"+"link": "https://example.com"+"title": "Some title"}

Вот мой ожидаемый результат

SimpleXMLElement {#111 ▼
+"guid": "1"+"link": "https://example.com"+"title": "Some title"+"content" {
0 => {
+"Location": "San Diego"+"PublishedOn": "2016-10-21T11:21:07"+"Body": "Lorem ipsum dolar"+"JobCountry": "USA"}
1 => {
+"Location": "Detroit"+"PublishedOn": "2016-10-21T11:21:07"+"Body": "Lorem ipsum dolar"+"JobCountry": "USA"}
2 => {
+"Location": "Los Angeles"+"PublishedOn": "2016-10-21T11:21:07"+"Body": "Lorem ipsum dolar"+"JobCountry": "USA"}
}
}

У кого-нибудь есть решение для этого?

2

Решение

Вы должны использовать пространство имен для доступа. Здесь мы используем DOMDocument достичь желаемого результата. DOMDocument функция getElementsByTagNameNS, в этом мы проходим namespace uri и его обязательное содержание. так что ожидаемый результат может быть достигнут.

Если вы предпочитаете использовать simplexml_load_string Вы можете проверить это. Демонстрация кода PHP

Попробуйте этот фрагмент кода здесь

<?php

ini_set('display_errors', 1);

libxml_use_internal_errors(true);
$string=<<<HTML
<rss version="2.0" xmlns:a10="http://www.w3.org/2005/Atom">
<channel>
<title>mMin title</title>
<description>Some description</description>
<managingEditor>[email protected]</managingEditor>
<category>Some category</category>
<item>
<guid isPermaLink="false">1</guid>
<link>https://example.com</link>
<title>Some title</title>
<a10:updated>2017-05-30T13:20:22+02:00</a10:updated>
<a10:content type="text/xml">
<Location>Detroit</Location>
<PublishedOn>2016-10-21T11:21:07</PublishedOn>
<Body>Lorem ipsum dolar</Body>
<JobCountry>USA</JobCountry>
</a10:content>
</item>
</channel>
</rss>
HTML;
$data=array();
$completeData=array();
$domDocument = new DOMDocument();
$domDocument->loadXML($string);
$results=$domDocument->getElementsByTagNameNS("http://www.w3.org/2005/Atom", "content");
foreach($results as $result)
{
if($result instanceof DOMElement && $result->tagName=="a10:content")
{
foreach($result->childNodes as $node)
{
if($node instanceof DOMElement)
{
$data[]=$node->nodeValue;
}
}
}
$completeData[]=$data;
}
print_r($completeData);
1

Другие решения

Вот мое рабочее решение

$xml = file_get_contents("https://example.com/RSSFeed");

$string = str_replace(array("<a10:content","</a10:content>"), array("<content","</content>"), $xml);

$sxe = new \SimpleXMLElement($string);

$jobs = array();

foreach ($sxe as $item) {

dd($item);

}
1

Во-первых, не используйте простой XML, это дерьмо! Вы намного лучше, используя DOMDocument.

http://php.net/manual/en/class.domdocument.php

<?php

$dom = new DOMDocument();
$dom->loadXML($xml);$items = $dom->getElementsByTagName('item');
$array = array();

foreach($items as $item)
{
$title = $item->getElementsByTagName('title')->item(0)->nodeValue;
$link = $item->getElementsByTagName('link')->item(0)->nodeValue;
$updated = $item->getElementsByTagName('updated')->item(0)->nodeValue;
$location = $item->getElementsByTagName('Location')->item(0)->nodeValue;
$pub = $item->getElementsByTagName('PublishedOn')->item(0)->nodeValue;
$body = $item->getElementsByTagName('Body')->item(0)->nodeValue;
$job = $item->getElementsByTagName('JobCountry')->item(0)->nodeValue;

$array[] = [
'title' => $title,
'link' => $link,
'updated' => $updated,
'Location' => $location,
'PublishedOn' => $pub,
'Body' => $body,
'JobCountry' => $job,
];
}

var_dump($array);

Который даст вам это:

array(7) { ["title"]=> string(12) "Some title 1" ["link"]=> string(21) "https://example.com/1" ["updated"]=> string(25) "2017-05-30T13:20:22+02:00" ["Location"]=> string(9) "San diego" ["PublishedOn"]=> string(19) "2016-10-21T11:21:07" ["Body"]=> string(17) "Lorem ipsum dolar" ["JobCountry"]=> string(3) "USA" }

Посмотреть здесь! https://3v4l.org/E0UXJ

Теперь это работает, давайте оптимизируем его, создав удобную функцию:

function domToArray($item, array $cols)
{
$array = [];
foreach ($cols as $col) {
$val = $item->getElementsByTagName($col)->item(0)->nodeValue;
$array[$col] = $val;
}
return $array;
}

$dom = new DOMDocument();
$dom->loadXML($xml);

$items = $dom->getElementsByTagName('item');
$array = array();

$fields = [
'title',
'link',
'updated',
'Location',
'PublishedOn',
'Body',
'JobCountry',
];

foreach($items as $item)
{
$array[] = domToArray($item, $fields);
}

var_dump($array);

Тот же вывод, смотрите здесь https://3v4l.org/W6HM3

0
По вопросам рекламы [email protected]