getAttribute от объекта DOM, не возвращающего атрибуты

Я пишу программу, которая получает экономическую и социальную статистику из нескольких внешних источников и включает их в базу данных (для анализа данных). Некоторые данные поступают в формате XML, и для их анализа мне необходимо идентифицировать элементы / теги, а также атрибуты в файле XML. Для определения атрибутов я попытался использовать getAttribute.

Проблема: хотя getElementsByTagName работает, getAttribute — нет. Попытка извлечь значение атрибута «Индекс» из элемента ячейки возвращает «», даже если атрибут «Индекс» существует в ряде элементов ячейки. Нет ошибки, просто не возвращено значение.

Я провел несколько дней, читая руководства по PHP и исследуя Интернет, пытаясь найти решение, но безуспешно.
Вывод или var_dump в возвращаемом значении getAttribute показывает, что он всегда возвращает «».
Вместо того, чтобы помещать весь исходный код, я воспроизвел более простую версию чтения XML-файла ниже, которая будет иметь ту же проблему невозможности вернуть атрибуты (в данном случае атрибут ‘Index’).

<?php

// Creates new DOMDocument
$dom = new DOMDocument();
// Loads XML file into DOMDocument
$dom->load('FRED_formatted_list.xml');

// Stores all the instances of the Row tag into $rows
$rows = $dom->getElementsByTagName('Row');

// Iterates through all the instances of the Row tag
foreach($rows as $row) {

// Stores all the instances of the Cell tag into $cells
$cells = $row->getElementsByTagName('Cell');

// Iterates through all the instances of the Cell tag
foreach($cells as $cell) {

// Checks if the Index attribute exists in the cell tag
if($cell->hasAttribute('Index')) {
// Stores the value of any instances of the Index attribute
$attr = $cell->getAttribute('Index');
// Prints the value of any instances of the Index attribute to screen
echo "Value of index attribute: " . $attr . "<br>";

}
// Check that the cell tags have been properly identified in the DOM Object
echo $cell->nodeValue . "<br>";
// Double checks whether any index values are even found and stored in $attr
var_dump($attr) . "<br>";
}
}
?>

Вот пример XML-файла, который показывает, что атрибут «Индекс» существует, хотя и не возвращается getAttributes:

<Row>
<Cell><Data ss:Type="String">AAA</Data></Cell>
<Cell ss:Index="3"><Data ss:Type="String">Board of Governors of the Federal Reserve System (US)</Data></Cell>
<Cell><Data ss:Type="String">H.15 Selected Interest Rates</Data></Cell>
<Cell><Data ss:Type="String">Percent</Data></Cell>
<Cell><Data ss:Type="String">Not Seasonally Adjusted</Data></Cell>
<Cell><Data ss:Type="String">The Federal Reserve Board has discontinued this series as of October 11, 2016. More information, including possible alternative series, can be found at http://www.federalreserve.gov/feeds/h15.html. </Data></Cell>
</Row>

Любая помощь будет оценена. Я подведу итог решения и повторно опубликовать, чтобы помочь другим.

1

Решение

После дополнительных исследований я нашел кого-то еще, кто столкнулся с этой проблемой и сумел ее решить. Атрибут ‘Index’ в теге / элементе ячейки XML предварительно фиксируется с помощью ‘ss:’ (согласно приведенному выше извлечению файла XML). <Cell ss:Index="3"><Data ss:Type="String">). Чтобы getAttribute работал, необходимо включить ‘ss:’, например, правильный код будет getAttribute('ss:Index') вместо
getAttribute('Index')
Я не совсем понимаю, как getAttribute идентифицирует атрибут, но может случиться так, что он ищет строку последовательных символов с пробелом перед и, следовательно, должен быть включен ss:.

0

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

Определите пространство имен в xml:

<Row xmlns:ss="something">
<Cell><Data ss:Type="String">AAA</Data></Cell>
<Cell ss:Index="3"><Data ss:Type="String">Board of Governors of the Federal Reserve System (US)</Data></Cell>
<Cell><Data ss:Type="String">H.15 Selected Interest Rates</Data></Cell>
<Cell><Data ss:Type="String">Percent</Data></Cell>
<Cell><Data ss:Type="String">Not Seasonally Adjusted</Data></Cell>
<Cell><Data ss:Type="String">The Federal Reserve Board has discontinued this series as of October 11, 2016. More information, including possible alternative series, can be found at http://www.federalreserve.gov/feeds/h15.html. </Data></Cell>
</Row>

Попробуйте следующий код, чтобы получить значение атрибута с пространством имен:

<?php

// Creates new DOMDocument
$dom = new DOMDocument();
// Loads XML file into DOMDocument
$dom->load('FRED_formatted_list.xml');

// Stores all the instances of the Row tag into $rows
$rows = $dom->getElementsByTagName('Row');
$attr ='';
// Iterates through all the instances of the Row tag
foreach($rows as $row) {

// Stores all the instances of the Cell tag into $cells
$cells = $row->getElementsByTagName('Cell');

// Iterates through all the instances of the Cell tag
foreach($cells as $cell) {
// Checks if the Index attribute exists in the cell tag
if($cell->attributes->getNamedItem('Index')) {
// Stores the value of any instances of the Index attribute
$attr = $cell->attributes->getNamedItem('Index')->nodeValue;
// Prints the value of any instances of the Index attribute to screen
echo "Value of index attribute: " . $attr . "<br>";

}
// Check that the cell tags have been properly identified in the DOM Object
echo $cell->nodeValue . "<br>";
// Double checks whether any index values are even found and stored in $attr
var_dump($attr) . "<br>";}

}
0

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