0

URLの解析にはphpとsimplexmlを使用します。simplexmlノードの値を取得して変更したいのですが、最初にそれを文字列に変換しますが、ucfirst()はその文字列に対して機能しません。

$xml = simplexml_load_file($url); 

foreach($xml->offers->offer as $offer)
{
    $bodyType = (string) $offer->{"body-type"}; //I convert simplexml to string first  
    echo ucfirst($bodyType); // In this line ucfirst doesn't work
}

どのように対処しますか?

更新:ucfirstはラテン語でのみ機能するため、問題はキリル文字にありました。実用的な解決策は、この関数を使用することです。

    $bodyType = (string) $offer->{"body-type"};
    $encoding='UTF-8';
    $str = mb_ereg_replace('^[\ ]+', '', $bodyType); 
    $str = mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding). mb_substr($str, 1, mb_strlen($str), $encoding);
4

2 に答える 2

0

Farrukh's answertest.xmlを考えると、実際には型キャストを省略することさえできます。これは私にとってもうまくいきます:

<?php
$url = "test.xml";
$xml = simplexml_load_file($url); 

foreach($xml->offers->offer as $offer) {
    echo ucfirst($offer->{"body-type"}) .'<br>';
}

ライブデモはこちら: http://codepad.viper-7.com/L4VwPL


更新 (URL が OP によって提供された後)

ほとんどの場合、エンコードの問題が発生します。UTF-8 文字セットを明示的に設定すると、期待どおりに動作します (それ以外の場合、simplexml は破損した文字列のみを返します)。

$url = "http://carsguru.net/x/used/exchange/4.xml";
$xml = simplexml_load_file($url); 

header('Content-Type: text/html; charset=utf-8');
foreach($xml->offers->offer as $offer) {
    echo ucfirst($offer->{"body-type"}) .'<br>';
}

上記のスニペットを実行すると、次の出力が得られます (削除されます)。

фургон
универсал
хэтчбек
хэтчбек
минивэн
минивэн
минивэн
седан
седан
универсал
хэтчбек
универсал
седан
хэтчбек
седан

: xml の content-type/charset ヘッダーは提供しません。私はそれを追加します。


とにかく、これを見たいと思うかもしれません: iconv ->iconv("cp1251", "UTF-8", $str);


実際、ファイルのエンコーディングはキリル文字の windows-1251 です。これはおそらく理にかなっています。

なんで?もちろん、有効な UTF-8 を使用できます。これは、この cp1251-to-utf8-function で変換された XML のノードの例です(奇妙に見えるかもしれませんが、完全にレンダリングされます!)

<?xml version="1.0" encoding="UTF-8"?>
<auto-catalog>
    <creation-date>2013-02-07 02:00:08 GMT+4</creation-date>
    <host>carsguru.net</host>
    <offers>
        <offer type="commercial">
            <url>http://carsguru.net/used/5131406/view.html</url>
            <date>2013-02-07</date>
            <mark>&#1043;&#1040;&#1047;</mark>
            <model>2705</model>
            <year>2003</year>
            <seller-city>&#1057;&#1072;&#1085;&#1082;&#1090;-&#1055;&#1077;&#1090;&#1077;&#1088;&#1073;&#1091;&#1088;&#1075;</seller-city>
            <seller-phone>8-921-997-74-06</seller-phone>
            <price>150000</price>
            <currency-type>RUR</currency-type>
            <steering-wheel>&#1083;&#1077;&#1074;&#1099;&#1081;</steering-wheel>
            <run-metric>&#1082;&#1084;</run-metric>
            <run>194</run>
            <displacement>2300</displacement>
            <stock>&#1074; &#1085;&#1072;&#1083;&#1080;&#1095;&#1080;&#1080;</stock>
            <state>&#1061;&#1086;&#1088;&#1086;&#1096;&#1077;&#1077;</state>
            <color>&#1089;&#1080;&#1085;&#1080;&#1081;</color>
            <body-type>&#1092;&#1091;&#1088;&#1075;&#1086;&#1085;</body-type>
            <engine-type>&#1073;&#1077;&#1085;&#1079;&#1080;&#1085;</engine-type>
            <gear-type>&#1079;&#1072;&#1076;&#1085;&#1080;&#1081;</gear-type>
            <transmission>&#1088;&#1091;&#1095;&#1085;&#1072;&#1103;</transmission>
            <horse-power>98</horse-power>
            <image>http://carsguru.net/clf/03/af/9c/8b/used.4r9v39h31facog8cs0w0wk8ws.jpg.medium.jpg</image>
            <image>http://carsguru.net/clf/ae/51/be/3a/used.bxyc3q9mx80sko0wg80880w0k.jpg.medium.jpg</image>
            <image>http://carsguru.net/clf/28/dc/c1/d4/used.8i1b76l1b8o4cwg8gc08oos4s.jpg.medium.jpg</image>
            <image>http://carsguru.net/clf/55/3d/37/10/used.7dmn7puczuo0wo4cs8kko0cco.jpg.medium.jpg</image>
            <image>http://carsguru.net/clf/49/02/15/54/used.7k8lhomw4j4s4040kssk4kgso.jpg.medium.jpg</image>
            <equipment>&#1052;&#1072;&#1075;&#1085;&#1080;&#1090;&#1086;&#1083;&#1072;</equipment>
            <equipment>&#1055;&#1086;&#1076;&#1086;&#1075;&#1088;&#1077;&#1074; &#1079;&#1077;&#1088;&#1082;&#1072;&#1083;</equipment>
        </offer>
    </offers>
</auto-catalog>
于 2013-02-07T07:18:20.697 に答える
0

親愛なるplzもあなたのxmlファイルデータを共有してください。私は以下を使用しましたが、正常に動作しています..

<?xml version="1.0"?>
<data>
    <offers>
        <offer>
            <body-type>offer 1</body-type>
        </offer>
        <offer>
            <body-type>offer 2</body-type>
        </offer>
    </offers>
</data>

私の出力は

Offer 1
Offer 2

HTML: Offer 1<br />Offer 2<br />

次のphpコードで..

<?PHP
$url = "test.xml";
$xml = simplexml_load_file($url); 

foreach($xml->offers->offer as $offer)
{
    $bodyType = (string) $offer->{"body-type"}; //I convert simplexml to string first  
    echo ucfirst($bodyType); // In this line ucfirst doesn't work
    echo '<br />';
}


?>
于 2013-02-07T07:09:08.073 に答える