Autor Zpráva
roboti006
Profil *
Ahoj. Používáme k projekci textů program OpenLP. Už v něm mám slušnou zásobu písní, které jsem přepisoval, a teď mně zajímalo, zda se dá nějak jednoduše získat text z písní (<lyrics>). Podařilo se mi pomocí simpleXML vytáhnout z kódu Autory, název písní a pořadí slok (<properties>), nepodařilo se mi však zdárně dostat z něj text písní (což je docela podstatná část) - resp. snažil jsem se dostat do proměnné $textpisne pomocí foreach text podle názvu sloky, to mi však neprošlo, protože uvnitř sloky se vyskytují ještě formátovací tagy (<format>), a ty se bohužel nijak neprojevily. Můžete mi s tím prosím, poradit?
PHP:
<?php
   $xml=simplexml_load_file("xml.xml");
   $verseorder=$xml->properties->verseOrder;
   $versesorder=explode(' ',$verseorder);
   $verses=array_unique($versesorder);
   $verselyrics=$xml->lyrics->verse;
   foreach($verses as $versetitle){
      $verse[$versetitle]=$xml->xpath('/song/lyrics/verse[@name="'.$versetitle.'"]');
   }
   foreach($versesorder as $verseoutput){
      echo'<p>'.var_dump($verse[$verseoutput]).'</p>';
   }
?>
<html>
   <head>
      <meta http-equiv="content-type" content="text/html charset=UTF-8" />
   </head>
   <body>
<?php
echo$verselyrics;
echo '<h1>'.$xml->properties->titles->title.'</h1>';
foreach($verses as $oneverse){
   echo$oneverse.'&nbsp;|&nbsp;';
}
foreach($xml->properties->authors->author as $authorname){
   echo$authorname.', ';
}
echo'<p>'.$xml->lyrics.'</p>';
?>
XML:
<?xml version='1.0' encoding='UTF-8'?>
<song xmlns="http://openlyrics.info/namespace/2009/song" version="0.8" createdIn="OpenLP 2.0.3" modifiedIn="OpenLP 2.0.3" modifiedDate="2013-10-19T16:08:39">
  <properties>
    <titles>
      <title>Song0148329</title>
    </titles>
    <verseOrder>c1 v1 c1 v1 c1</verseOrder>
    <authors>
      <author>Autor1</author>
      <author>Autor2</author>
    </authors>
  </properties>
  <format>
    <tags application="OpenLP">
      <tag name="lfloa">
        <open>&lt;p style="float:left; width:50%;"&gt;</open>
        <close>&lt;/p&gt;</close>
      </tag>
      <tag name="trans">
        <open>&lt;p style="text-align:right; color:#555555;float:left;width:50%;"&gt;</open>
        <close>&lt;/p&gt;</close>
      </tag>
    </tags>
  </format>
  <lyrics>
    <verse name="c1">
      <lines>
        <tag name="lfloa">Float left text písně</tag>
        <tag name="trans">Float left překlad</tag>
      </lines>
    </verse>
    <verse name="v1">
      <lines>
        <tag name="lfloa">Float left text písně</tag>
        <tag name="trans">Float left překlad</tag>
      </lines>
    </verse>
  </lyrics>
</song>
Tabetha
Profil
môžeš sem hodiť aj ten text nejaký?
roboti006
Profil *
ok tady jsem to zjednodušil na dvě sloky, ať to nezabírá místo, ale celý text je tu:
<song xmlns="http://openlyrics.info/namespace/2009/song" version="0.8" createdIn="OpenLP 2.0.3" modifiedIn="OpenLP 2.0.3" modifiedDate="2013-11-11T18:55:32">
<properties>
<titles>
<title>Come, people of the risen King,</title>
</titles>
<verseOrder>v1 c1 v2 c1 v3 c1 c1</verseOrder>
<authors>
<author>Come</author>
<author>People</author>
<author>Keith and Kristyn Getty and Stuart Townend</author>
</authors>
</properties>
<format>
<tags application="OpenLP">
<tag name="lfloa">
<open><p style="float:left; width:45%;margin-left:3%;"></open>
<close></p></close>
</tag>
<tag name="trans">
<open>
<p style="text-align:right; color:#cccccc;float:left;width:45%;margin-right:5%">
</open>
<close></p></close>
</tag>
</tags>
</format>
<lyrics>
<verse name="v1">
<lines>
<tag name="lfloa">
Come, people of the risen King,
<br/>
Who delight to bring him praise.
<br/>
Come all, and tune your hearts to sing
<br/>
To the Morning star of grace.
<br/>
From the shifting shadows of the Earth
<br/>
We will lift our eyes to Him
<br/>
Where steady arms of mercy reach
<br/>
To gather children in.
</tag>
<br/>
<tag name="trans">
Pojďte, lidé vzkříšeného Krále,
<br/>
Kteří mu s potěšením přinášíte chválu.
<br/>
Pojďte všichni a nalaďte svá srdce ke zpěvu
<br/>
Pro Jitřní hvězdu milosti.
<br/>
Od nestálých stínů země
<br/>
Pozvedáme své oči k Němu,
<br/>
Kde pevné paže milosti vztáhnou se,
<br/>
Aby shromáždily své děti.
</tag>
</lines>
</verse>
<verse name="c1">
<lines>
<tag name="lfloa">
Rejoice, rejoice, let every tongue rejoice
<br/>
One heart, one voice,
<br/>
Oh, church of Christ, rejoice!
</tag>
<br/>
<tag name="trans">
Jásej, jásej, každý jazyk ať jásá
<br/>
Jedno srdce, jeden hlas
<br/>
Církvi Kristova, jásej!
</tag>
</lines>
</verse>
<verse name="v2">
<lines>
<tag name="lfloa">
Come those whose joy is morning sun
<br/>
And those weeping through the night.
<br/>
Come those who tell of battles won
<br/>
And those struggling in the fight.
<br/>
For His perfect love will never change
<br/>
And His mercies never cease
<br/>
But follow us through all our days
<br/>
With the certain hope of peace.
</tag>
<br/>
<tag name="trans">
Pojďte, vy, jejichž radostí je ranní slunce,
<br/>
I vy, kdo pláčete celou noc.
<br/>
Pojďte vy, kdo vyprávíte o vyhraných bitvách
<br/>
I vy, kdo zápasíte v boji.
<br/>
Neboť Jeho dokonalá láska se nikdy nezmění
<br/>
A Jeho milosrdenství nikdy neskončí,
<br/>
Ale projde s námi všemi našimi dny
<br/>
S pevnou nadějí pokoje.
</tag>
</lines>
</verse>
<verse name="v3">
<lines>
<tag name="lfloa">
Come young and old from ev´ry land
<br/>
Men and women of the faith.
<br/>
Come those with full or empty hands,
<br/>
Find the riches of His grace.
<br/>
Over all the world His people sing
<br/>
Shore to shore we hear them call
<br/>
The Truth that cries through ev´ry age:
<br/>
„Our God is all in all!“
</tag>
<br/>
<tag name="trans">
Pojďte mladí i staří ze všech zemí
<br/>
Muži i ženy víry.
<br/>
Pojďte, ať máte ruce plné nebo prázdné,
<br/>
Najděte bohatství Jeho milosti.
<br/>
V celém světě Jeho lidé zpívají
<br/>
Od pobřeží k pobřeží je slyšíme volat
<br/>
Pravdu, která v každém věku jásá:
<br/>
„Náš Bůh je všechno ve všem!“
</tag>
</lines>
</verse>
</lyrics>
</song>
Tabetha
Profil
tak po polhodinovom skúšaní, ti to nenačíta xpath a evidentne kvôli

<song xmlns="http://openlyrics.info/namespace/2009/song" version="0.8" createdIn="OpenLP 2.0.3" modifiedIn="OpenLP 2.0.3" modifiedDate="2013-11-11T18:55:32">
roboti006
Profil *
No, kdybych to měl z každé písně ručně odstraňovat, vyšlo by mi jednodušší přepsat písně do požadovaného formátu ručně. Nejde toto nějak obejít?
popř. není chyba kdesi v mém kódě?
Hrál jsem si trochu s kódem, stále nic moc, ale už jsem nalezl text... jen nevím jak to udělat, abych měl jen ten text + nějaké to formátování:
foreach($xml->lyrics->verse as $blablabla){
       echo'<p>';
       var_dump($blablabla);
       echo'</p>';
       echo'<br/>';
   }
z toho mi potom vylezlo toto:
object(SimpleXMLElement)#5 (2) { ["@attributes"]=> array(1) { ["name"]=> string(2) "c1" } ["lines"]=> object(SimpleXMLElement)#8 (1) { ["tag"]=> array(2) { [0]=> string(23) "Float left text písně" [1]=> string(19) "Float left překlad" } } }


object(SimpleXMLElement)#8 (2) { ["@attributes"]=> array(1) { ["name"]=> string(2) "v1" } ["lines"]=> object(SimpleXMLElement)#5 (1) { ["tag"]=> array(2) { [0]=> string(23) "Float left text písně" [1]=> string(19) "Float left překlad" } } }
jenže netuším jak z toho automaticky vytáhnout pouze slova
Tabetha
Profil
roboti006:
skúsim či by ti pomohol takýto nástrel, nemal som doteraz viac času sa tomu venovať, ale chvíľu som si našiel.
Vlastne ide o to, že si to XML pretvor do nejakej entity, poľa, objektu a navrhneš si to malo hlavu pätu (čo je logické) a šlo z toho dobre vygenerovať html.
Dúfam, že to nebolo zbytočné :)
<?php 
    $xml = new SimpleXMLElement("xml.xml", 0, true);
    $verseorder = $xml->properties->verseOrder;
    $versesorder = explode(' ', $verseorder);
    $verses = array_unique($versesorder);
    /** @var SimpleXMLElement $a */
    $verselyrics = $xml->lyrics->verse;

    $verse = array();
    foreach ($xml->lyrics->verse as $a) {
        $atrs = $a->attributes();
        $name = (string)$atrs[0];
//        foreach ($a->lines->tag as $tag) {
//            $_atrs = $tag->attributes();
//            $_name = (string)$_atrs[0];
//            $verse[$name][$_name] = (string)$tag;
//        }
        $verse[$name] = array(
            'original' => (string)$a->lines->tag[0],
            'translated' => (string)$a->lines->tag[1],
        );
    }

    foreach ($versesorder as $verseoutput) {
        echo '<p>' . (isset($verse[$verseoutput]) ? $verse[$verseoutput]['original'] : null) . '</p>';
    }
?>
roboti006
Profil *
Určitě pomohl... S tímto už určitě nějak dovedu pracovat. Jen ještě maličkost, dá se nějak udělat, aby to ignorovalo další tagy uvnitř textu?
tzn. kdybych měl kód
<tag name="trans">
Jásej, jásej, <tag>každý</tag> jazyk ať jásá
<br/>
Jedno srdce, jeden hlas
<br/>
Církvi Kristova, jásej!
</tag>
aby mi to vysypalo jen text, bez toho, aby to odebralo slovo "každý"?
Anonymousse
Profil *
strip_tags?

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0