Отображение определенных данных из файла XML на основе атрибута в PHP - PullRequest
0 голосов
/ 27 января 2012

Я довольно новичок в PHP и XML и застрял на одной конкретной проблеме с фидом xml. В данных XML есть одно поле «article_content» с уникальным атрибутом (id) для каждой новости. Мне нужно иметь возможность просто отобразить эту историю на странице на основе URL-адреса, созданного на странице индекса, на которой показаны все истории (пример URL-адреса - путь / к / файлу / newsstory.php? Storyid = 19837775), где storyid соответствует идентификатору атрибут в поле содержимого статьи.

Может ли кто-нибудь помочь, когда я бью головой об стену!


Обновление:

XML приведен в следующем формате (новый article_content для каждой истории)

<channel>
    <article_content id="19837775" status="A">
        <title>title of article 1</title>
        <date>20120127</date>
        <time>10:18:00</time>
        <body>main body of story 1 here</body>
        <introduction>intro text here</introduction>
        <abstract></abstract>
        <by_line></by_line>
        <category_id>0103</category_id>
    </article_content>
    [...]

php код, который я получил:

<?php
$xml = new SimpleXMLElement($rss);
$results = array ();
foreach ($xml->channel->article_content[id] as $item) {
    echo "<h3>".$item->title."</h3>";
    echo nl2br ($item->body->asXML());
}
?>

Ответы [ 2 ]

0 голосов
/ 27 января 2012

Первый пример того, как это можно сделать (используя XPath и расширение DOM php

<?php
$id = '19837775'; // this is the parameter you'd fetch from the url

$doc = new DOMDocument;
//$doc->load('feed.xml');
$doc->loadxml( getData() );

$xpath = new DOMXPath($doc);
foreach ( $xpath->query('story[@article_content="'.$id.'"]') as $story ) {
    echo $doc->savexml($story); 
}


function getData() {
    return <<< eox
<stories>
    <story article_content="1">content 1</story>
    <story article_content="2">content 2</story>
    <story article_content="19837775">content 19837775</story>
    <story article_content="22222222">content 22222222</story>
</stories>  
eox;
}

печать

<story article_content="19837775">content 19837775</story>

.... но, в конце концов, это не очень хорошее решение. Это зависит от того, чего вы на самом деле пытаетесь достичь (и насколько масштабным должно быть решение).
Пожалуйста, уточните.


обновление: пример использования фактической структуры данных.

<?php
$id = '19837775'; // the parameter fetched from the request

$doc = new DOMDocument;
//$doc->load('feed.xml');
$doc->loadxml( getData() );

$xpath = new DOMXPath($doc);

$article = firstNode( $xpath->query('article_content[@id="'.$id.'"]') );
if ( !$article ) {
    die('no such article');
}

$title = firstNode( $xpath->query('title', $article) );
$date = firstNode( $xpath->query('date', $article) );
$body = firstNode( $xpath->query('body', $article) );

// TODO: check $title, $data and $body

echo 'title: ', $title->nodeValue, "\n";
echo 'date: ', $title->nodeValue, "\n";
echo 'body: ', $doc->savexml($body), "\n";
echo 'body->nodeValue: ', $body->nodeValue;
die;

function firstNode($nodelist) {
    if ( $nodelist instanceof DOMNodeList && 0<$nodelist->length ) {
        return $nodelist->item(0);
    }
    return false;
}

function getData() {
    return <<< eox
<channel>
    <article_content id="1" status="X"></article_content>
    <article_content id="19837775" status="A">
        <title>title of article 1</title><date>20120127</date><time>10:18:00</time>
        <body><h1>main body of story 1</h1><p>Not just plain text</p></body>
        <introduction>intro text here</introduction><abstract></abstract><by_line></by_line><category_id>0103</category_id>
    </article_content>
    <article_content id="20000000" status="X"></article_content>
    <article_content id="20000001" status="X"></article_content>
</channel>
eox;
}

печать

title: title of article 1
date: title of article 1
body: <body><h1>main body of story 1</h1><p>Not just plain text</p></body>
body->nodeValue: main body of story 1Not just plain text

Возможно, вас также заинтересует https://en.wikipedia.org/wiki/XSLTXSL, который также использует XPath для выбора узлов, но позволяет преобразовать вывод (например, из вашего xml-представления в удобный HTML-формат).

0 голосов
/ 27 января 2012

Без вашего XML я могу показать только этот пример ( взято отсюда) :

$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<movies>
 <movie>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
</movies>
XML;

Для вывода атрибута типа:

$movies = new SimpleXMLElement($xmlstr);
echo $movies->movie[0]->rating[0]['type']

Пример здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...