PHP: Как извлечь «тип контента =» application / xml & quot; узлы из файла XML?

У меня есть действительный файл XML (сгенерировано из SharePoint) который выглядит так (в браузере):

Образец XML-файла

<?xml version="1.0" encoding="utf-8"?>
<feed xml:base="https://www.example.com/_api/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
<id>9913f043-xxxx-xxxx-xxxx-xxxx-xxxx</id>
<title />
<updated>2017-05-23T06:08:01Z</updated>
<entry m:etag="&quot;23&quot;">
<id>Web/Lists(guid'13306095-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx')/Items(1)</id>
<category term="SP.Data.XXXXXXXXXXXXXXXXXXXXX" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
<link rel="edit" href="Web/Lists(guid'13306095-xxxx-xxxx-xxxx-xxxx-xxxx')/Items(1)" />
<title />
<updated>2017-05-23T06:08:01Z</updated>
<author>
<name />
</author>
<content type="application/xml">
<m:properties>
<d:FileSystemObjectType m:type="Edm.Int32">0</d:FileSystemObjectType>
<d:Id m:type="Edm.Int32">1</d:Id>
<d:ContentTypeId>0x0100B6A3B67BE96F724682CCDC8FBE9D70C2</d:ContentTypeId>
<d:Title m:null="true" />
<d:Topic>How to google?</d:Topic>
<d:Cats m:type="Collection(Edm.Int32)">
<d:element>1</d:element>
<d:element>2</d:element>
<d:element>3</d:element>
<d:element>4</d:element>
<d:element>5</d:element>
<d:element>6</d:element>
<d:element>7</d:element>
</d:Cats>
</m:properties>
</content>
</entry>
<entry>
.
.
</entry>
<entry>
.
.
</entry>
</feed>

(Примечание: здесь я отрезал несколько повторяющихся узлов, потому что это очень долго.)

Очевидно, у нас есть внутренние узлы <content type="application/xml"> которые также содержать данные внутри.

Проблема (при разборе с PHP)

В PHP я использовал этот код для анализа (пытаясь извлечь его):

$xml = simplexml_load_file("data.xml");
foreach ($xml->entry as $item) {
echo $item->updated . PHP_EOL; // <--- This works!
print_r($item->content);       // <--- This doesn't work as expected.
}

.. а потом, это дает мне это:

2017-05-23T06:08:01Z
SimpleXMLElement Object
(
[@attributes] => Array
(
[type] => application/xml
)
)
2017-05-23T06:08:01Z
SimpleXMLElement Object
(
[@attributes] => Array
(
[type] => application/xml
)
)
.
.

Вопрос (Помогите!)

Как извлечь (получить) фактические данные внутри этих <content type="application/xml"> узлы, пожалуйста?

Пожалуйста помоги. Заранее спасибо.

0

Решение

Элементы ниже «содержимого» имеют пространство имен (d: …). У меня была такая же проблема некоторое время назад. Это должно помочь:

$xml = simplexml_load_file("data.xml");
foreach ($xml->entry as $item) {
echo $item->updated . PHP_EOL;
$ns = $item->content->children('http://schemas.microsoft.com/ado/2007/08/dataservices/metadata');
print_r($ns->properties);
}

Я обновил код. Я уверен, что print_r ($ ns-> properties) не показывает полные подэлементы … потому что они из другого пространства имен. Я думаю, что вы можете сделать это:

$nsd = $ns->properties->children("http://schemas.microsoft.com/ado/2007/08/dataservices");

и получилось с результатом.

В вашем примере пространства имен можно найти в элементе документа:
xmlns: d = «http://schemas.microsoft.com/ado/2007/08/dataservices» xmlns: m = «http://schemas.microsoft.com/ado/2007/08/dataservices/metadata»
(используйте URL между кавычками)
d: и m: используются в документе для ссылки на эти пространства имен.

РЕДАКТИРОВАТЬ: есть другое пространство имен. Не узнал этого. Решение может быть исправлено. Я немного изменил код.

1

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

Других решений пока нет …