Jump to content
php.lv forumi

XML kļūda, not well-formed (invalid token).


pilots

Recommended Posts

man php kodam ir problēmas ar nevalīda rss lasīšanu. attiecīgajā rss barotnē title elementā (un iespējams arī citur tās barotnes kodā) ir simboli & (bet būtu jābūt &).

 

es, protams, varu tikai savā pusē risinājumu meklēt, vai ņemt barotni no saraksta ārā.

 

pagaidām izdomāju pirms parsēšanas ar str_replace samainīt & pret & , bet lieta tāda, ka citās barotnēs ir &.

 

vai ir iespējams izveidot skriptu, kurš aizvietotu tikai &, lai nesanāk & ?

Link to comment
Share on other sites

Es jau nu ieteiktu tādu fīdu neparsēt.

Bet ir iespējams arī ar regexpu repleicot to & uz & tā lai &'us neaiztiek.

preg_replace('/&([^a]|a[^m]|am[^p]|amp[^;])/', '&\1', $text);

Tik te protams atkal gļuks ar visādiem " ' & #177; un citām entītēm... Vispārīgā gadījumā būtu jālaiž regexps uz &<jebkas>; un callbackā tas <jebkas> jāpārbauda uz html entītes valīdumu - ja nav, tad jārepleiso uz to amp, ja ir entīte, tad jāatstāj kā ir.

Link to comment
Share on other sites

jā, gļuks manliekas neizpaliks. šobrīd man tikai & ir traucējis. nezinu, kas notiks ar citiem neatļautajiem simboliem.

 

šķiet vienā vakarā būs jānotestē, kas notiek.

 

es pats tos regexp nemāku, biju izdomājis aizstāt visus & ar & un pēcāk otru reizi iet cauri un aizstāt &amp; ar & ...

Link to comment
Share on other sites

CDATA var likt jebkur kur parasta xml elementa dati var atrasties. Tam nav nekāda sakara ar tava xml elementu konkrēto pielietojumu (title).

<root>
 some text <elem1><CDATA[shnjaga1]]></elem1>
blah blah
<elem2>zzzz<CDATA[shnjaga2]]>yyy</elem2>
blah
<CDATA[shnjaga3]]>
</root>

Link to comment
Share on other sites

vai es pareizi sapratu, ka Paulinjsh norādot uz CDATA, rosina pirms parsēšanas, piemēram, manā gadījumā aizstāt <title> ar <![CDATA[ un </title> ar ]]> ? ja nu tas tā darbotos, tad liekot datubāzē, atliktu tik piemest htmlspecialchars.

 

 

piedodiet, ka to jautāju, bet nav pieejams kompjūters ar localhost testēšanai šobrīd.

Link to comment
Share on other sites

Nē, tu nesaprati. CDATA nav <title> elementa aizstājējs. CDATA ir character-data. Skaties, šie divi XML ir praktiski vienādi:

<xml>
<title>blah</title>
<author>bubu</title>
<elem1>
asdasd<b>zzzz</b>yyyy</elem1>
</xml>

un

<xml>
<title><![CDATA[blah]]></title>
<author><![CDATA[bubu]]></title>
<elem1>
<![CDATA[asdasd]]><b><![CDATA[zzzz]]></b><![CDATA[yyyy]]></elem1>
</xml>

 

Taču, ja tev nav pieeja sourcei, kas ģenerē šos xml'us, un nav iespējas to izmainīt, tad tur neko nepadarīsi ar šiem CDATA.

Link to comment
Share on other sites

×
×
  • Create New...