0

私は文字列の形式で XML を持っています (XLS 変換後):

<course>
    <topic>
        <chapter>Some value</chapter>
        <title>Some value</title>
        <content>Some value</content>
    </topic>
    <topic>
        <chapter>Some value</chapter>
        <title>Some value</title>
        <content>Some value</content>
    </topic>
    ....
</course>

次に、上記の XML を Array() にプッシュします。

$new_xml = $proc->transformToXML($xml);

$xml2 = simplexml_load_string($new_xml);
$root = $xml2->xpath("//topic");

$current = 0;
$topics_list = array();

// put the xml values into multidimensional array
foreach($root as $data) {
    if ($data === 'chapter') {
        $topics_list[$current]['chapter'] = $data->chapter;
    }
    if ($data === 'title') {
        $topics_list[$current]['title'] = $data->title;
    }
    if ($data === 'content') {
        $topics_list[$current]['content'] = $data->content;
    }
    $current++;
}
print_r($topics_list);

問題:結果が空の配列です。次のような文字列を試しました:

$topics_list[$current]['chapter'] = (string) $data->chapter;

しかし、結果はまだ空です。誰が説明できますか、私の間違いはどこですか。ありがとう。

4

3 に答える 3

3

私のトピック要素には単純な子要素しかなく、属性がないため、配列にキャストしてリスト ( Demo )に追加できます。

$xml2 = SimpleXMLElement($new_xml);
$topics_list = array();
foreach ($xml2->children() as $data) {
    $topics_list[] = (array) $data;
}

別の方法はget_object_vars、トピック要素 ( Demo )にマップすることです。

$topics_list = array_map('get_object_vars', iterator_to_array($xml2->topic, false));

しかし、それは読む/従うのが少し難しくなるかもしれません. Foreach の方がおそらく適切です。


そして、ここに私のコードの最初の作業バージョンがあります:

$xml2 = SimpleXMLElement($new_xml);
$current = 0;
$topics_list = array();
foreach($xml2->children() as $data) {
    $topics_list[$current]['chapter'] = (string) $data->chapter;
    $topics_list[$current]['title'] = (string) $data->title;
    $topics_list[$current]['content'] = (string) $data->content;
    $current++;
}

@Jack、@CoursesWeb、@fab の調査に感謝します。

于 2013-02-10T20:04:19.327 に答える
1

問題は、xml 要素の名前を取得できないことです。

xml 要素の名前を取得するには、適用します。elm->getName()

あなたのコードでは次のようにする必要があります。

if ($data->getName() === 'chapter')

Simplexml を使用した xml 要素のトラバースと取得の詳細については、次のチュートリアルを参照してください: http://coursesweb.net/php-mysql/php-simplexml

于 2013-02-10T14:49:31.660 に答える
1

いくつかの間違いがあります。

1. xpath() の戻り値

$root = $xml2->xpath("//topic");

$rootここでは、 XPath によって取得されたすべてのノードのリストに割り当てます//topic。したがって、それを反復処理すると

foreach($root as $data)

$data は<topic>、それらの子ではなく、各要素を参照します。

2. SimpleXMLElements と文字列の比較

$data正しい要素をループして要素を参照すると仮定しましょう<chapter>。その場合、次の式が真になります。

$data == 'Some value'
(string) $data === 'Some value'

ただし、SimpleXMLElement と文字列の間でタイプ セーフな比較 ( ) を行うことはできず===、文字列への変換は要素名にはなりません。あなたがしたいことは次のとおりです。

if ($data->getName() === 'chapter')

3. テキスト値の取得方法

上記の説明からすでに明らかなはずですが、交換する必要もあります

$data->chapter

(string) $data
于 2013-02-10T14:53:12.003 に答える