У меня есть действительный файл XML (сгенерировано из SharePoint) который выглядит так (в браузере):
<?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=""23"">
<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 я использовал этот код для анализа (пытаясь извлечь его):
$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">
узлы, пожалуйста?
Пожалуйста помоги. Заранее спасибо.
Элементы ниже «содержимого» имеют пространство имен (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: используются в документе для ссылки на эти пространства имен.
РЕДАКТИРОВАТЬ: есть другое пространство имен. Не узнал этого. Решение может быть исправлено. Я немного изменил код.
Других решений пока нет …