Я провел целые дни с функциями PHP DOM, но я не могу понять, как это работает.:( У меня есть простой XML файл, который выглядит хорошо, но я не могу его использовать, как я думаю, когда я создал его структуру.
Пример фрагмента XML:
-pages //root element
-page id="1" //we can have any number of pages
-product id="364826" //we can have any number of products
-SOME_KIND_OF_VALUE
-ANOTHER_VALUE
...
Моя первоначальная идея заключалась в том, чтобы ускорить работу моего клиентского процесса, поэтому я выбрасываю старые CSV и начинаю использовать XML.
Проблема 1: Когда я группирую продукты на странице, я использую setIdAttribute, чтобы предотвратить сохранение одной и той же страницы в дереве более одного раза. Это работает нормально, пока не происходит чтение, потому что эти идентификаторы привязаны к некоторому DTD (на основе getElementById).
Вопрос 1:
Как я могу написать простой DTD, который предоставляет эти необходимые данные, поэтому я могу использовать getElementById
на этапе чтения тоже?
Проблема 2:
Потому что у меня есть страницы, которые я бы хотел загрузить как можно меньше информации. Вот почему я создал атрибут id на страницах. Теперь я не могу получить доступ к моей странице id = "2" напрямую, потому что проблема 1 выше (getElementById
не имеет смысла в настоящее время). Как-то мне удалось получить необходимую информацию о каждом продукте на данной странице, но мой код выглядит страшно:
$doc = DOMDocument::load('data.xml');
$xpath = new DOMXPath($doc);
$query = '/pages/page[' . $page . ']'; //$page is fine: was set earlier
$products = $xpath->query($query);
$_prods = $doc->getElementsByTagName('product');
foreach($_prods as $product){
foreach($product->childNodes as $node){
echo $node->nodeName . ": " . $node->nodeValue . "<br />";
}
}
Квестон 2: Я думаю, что приведенный выше код является примером того, как не анализировать XML. Но из-за моих ограниченных знаний о функциях PHP DOM я не могу написать чище один сам. Я попробовал какое-то тривиальное решение, но никто из них не работал у меня.
Пожалуйста, помогите мне, если сможете.
Спасибо, Fabrik