Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > где ошибка??


Автор: Wanderer2019 23.6.2005, 17:38
файл temp.php
Код

<?php
$news = array();

$xml = join('',file('temp.xml'));
$xml = xmldoc($xml);

$xml->xpath_init();

$ctx = xpath_new_context($xml);

$nodes = xpath_eval($ctx,'//news');

foreach($nodes->nodeset as $node)
{
    $currentNews = array();
    $currentNews[0] = $node->get_attribute('date');
    $content = $node->children();
    foreach($content as $contentNode)
    {
        if (($contentNode->type==XML_ELEMENT_NODE)&&
            (in_array($contentNode->name,array('title','text')))){
            $currentNews[$contentNode->name] = $contentNode->content;
        }
    };
};
print_r($news);
?>
<html>
<head>
    <title>Новости</title>
</head>
<body>
<table width="100%" border="1">
<?php
foreach($news as $n)
{
?>
<tr>
    <td width="90%"><b><?php echo $n['title']; ?></b></td>
    <td><?php echo $n['date']; ?></td>
</tr>
<tr>
    <td colspan="2"><?php echo $n['text']; ?><br><br></td>
</tr>
<?php
};
?>
</table>
</body>
</html>    

файл temp.xml, из той же дериктории что и temp.php
Код

<?xml version="1.0"?>
<newsLine>
    <news date="1.1.2002">
        <title>title 1</title>
        <text>news text 1</text>
    </news>
    <news date="5.1.2002">
        <title>title 2</title>
        <text>news text 2</text>
    </news>
    <news date="10.1.2002">
        <title>title 3</title>
        <text>news text 3</text>
    </news>
</newsLine>


не читаются даже $contentNode->name и $contentNode->content ... в любой момент цикла они пустые, а вот дата читается...
где проблема??? подскажите plz...

Автор: IZ@TOP 24.6.2005, 19:15
Wanderer2019, зачем такой изврат? Есть решение проще http://forum.vingrad.ru/index.php?showtopic=56109&view=findpost&p=449139, используй XML + XSL.

Автор: Wanderer2019 24.6.2005, 22:29
Почитал указанную ветку... не уверен, что понял. Не мог бы ты немного поподробней изложить хотя бы общую концепцию связки XML+XSL??? т.е. предложение вообще не использовать PHP???? читать XML средствами шаблонов XSL???????
Добавлено @ 22:36
вот немного начал писать... получилось.. но гиморно... т.е. реализовал только работу с идеальными таблицами... причем сделал только проверку цвета, фона, на bold, размер шрифта, и шрифт... а сколько ж там еще то!!!!
Добавлено @ 22:36
ах да вот код:
Код

<?
$dom1 = domxml_open_file("test1.xml");

$context = xpath_new_context($dom1);

$result = xpath_eval($context, "//Worksheet/Table/Row");
$styles = xpath_eval($context, "//Styles/Style");
$thisStyle[][]=array();
foreach($styles->nodeset as $style){
    if($style->node_name()=='Style')
        $styleId=$style->get_attribute('ID');
    $items=$style->children();
    foreach($items as $item){
        if ($item->type==XML_ELEMENT_NODE)
            if($item->node_name()=='Font'){
                if($item->get_attribute('FontName')!=null)
                     $thisStyle[$styleId]['FontName']=$item->get_attribute('FontName');
                else
                     $thisStyle[$styleId]['FontName']="Veranda";
                if($item->get_attribute('Color')!=null)
                     $thisStyle[$styleId]['Color']=$item->get_attribute('Color');
                else
                     $thisStyle[$styleId]['Color']="Black";
                if($item->get_attribute('Size')!=null)
                     $thisStyle[$styleId]['Size']=$item->get_attribute('Size')/3;
                else
                     $thisStyle[$styleId]['Size']="3";
                if($item->get_attribute('Bold')!=null){
                    if($item->get_attribute('Bold')==1)
                        $thisStyle[$styleId]['Bold']="<b>";    
                }
                else
                     $thisStyle[$styleId]['Bold']="";
            }
            if($item->node_name()=='Interior'){
                if($item->get_attribute('Color')!=null)
                    $thisStyle[$styleId]['InteriorColor']=$item->get_attribute('Color');
                else 
                    $thisStyle[$styleId]['InteriorColor']='#FFFFFF';
            }
        }
    }
print "<table border=0 cellspacing='3' cellpadding='0' width='100%'>";
foreach($result->nodeset as $node){
    print "<tr>";
    $content=$node->children();
    foreach($content as $contentNode){
        if ($contentNode->type==XML_ELEMENT_NODE){
            $id=$contentNode->get_attribute('StyleID');
            if($thisStyle[$id]['Bold']=="<b>"){
                $startSpacer="<b>";
                $endSpacer="</b>";
            }
            else{
                $startSpacer="";
                $endSpacer="";
            }
            if($id!=null){
                print "<td bgcolor=".$thisStyle[$id]['InteriorColor'].">";
                print "<font face='".$thisStyle[$id]['FontName']."' color='".$thisStyle[$id]['Color']."' size='".$thisStyle[$id]['Size']."'>".$startSpacer.iconv("UTF-8","windows-1251",$contentNode->get_content()).$endSpacer."</font>";
                print "</td>";
                $id=null;
            }
            else{
                $id='Default';
                print "<td bgcolor=".$thisStyle[$id]['InteriorColor'].">";
                print "<font face='".$thisStyle[$id]['FontName']."' color='".$thisStyle[$id]['Color']."' size='".$thisStyle[$id]['Size']."'>".iconv("UTF-8","windows-1251",$contentNode->get_content())."</font>";
                print "</td>";
                $id=null;
            }
        }
    }
    print "</tr>";
}
print "</table>";
?>

Автор: IZ@TOP 25.6.2005, 14:56
Суть в том, что тебе нужно генерировать только XML и написать несколько шаблонов xsl, которые будут обрабатывать эти данные, ничего связанного с тем чтобы строить сам HTML в РНР быть не должно.

Автор: Wanderer2019 25.6.2005, 22:31
ну исходя из примеров в параллельной ветке не совсем понимаю смысл... судя по названиям тэгов там те же циклы и те жи переменные... в чем же смысл??? вроде на пхп это написать попроще будет... smile

Автор: IZ@TOP 26.6.2005, 00:31
Wanderer2019, ну если идти путем XML технологий, то думаю что на XSL все же надо делать. А проще на РНР это может и так, но удобней несомненно будет делать на XSL.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)