0

xpathが何も取得しないのは何が間違っているのですか?この関数は、深さが少し浅い別のxmlファイルで正常に機能します。

function xml2csv($xmlFile, $xPath) {
    $xml = simplexml_load_file($xmlFile);
    $path = $xml->xpath($xPath);
    $csvData = '';
    foreach($path as $item) {
        foreach($item as $key => $value) {
            $csvData .= '"' . trim($value) . '"' . ',';
        }
        $csvData = trim($csvData, ',');
        $csvData .= "\n";

    }
    return $csvData;
}

使用されているXML

<?xml version='1.0'?>
<bl>
    <section>
        <grade gradeLevel="1">
            <level dirname="The folder of pdfs">
                <file filename="hello_world.pdf">Hello world</file>
                <file filename="the_avengers.pdf">The Avengers</file>
                <file filename="batman.pdf">Batman</file>
            </level>
        </grade>
    </section>
</bl>

xml2csv('test.xml', 'bl');何も呼び出さない場合は、それ以降bl/section/grade/*などと同様に、単数ターゲティングも試みました。少なくともファイル名が出力されることを期待しています。

うまく機能しているように見えるXML上記と同じ方法を使用して以下のxmlをターゲットにできますxml2csv('cars.xml', 'car');

<?xml version='1.0'?>
<cars>
    <car>
        <color>blue</color>
        <price>2000</price>
    </car>
    <car>
        <color>red</color>
        <price>10000</price>
    </car> 
    <car>
        <color>black</color>
        <price>5000</price>
    </car>
</cars>

車のXML出力

"blue","2000"
"red","10000"
"black","5000"
4

1 に答える 1

0

関連付けるには、元の xml2csv 関数を変更する必要がありました。を使用してターゲットを絞ったsection/grade

更新機能はまだ進行中です

function xml2csv($xmlFile, $xPath) {
    $xml = simplexml_load_file($xmlFile);
    $path = $xml->xpath($xPath);
    $csvData = '';
    foreach($path as $item) {
        $attributes = $item->attributes();
        $gradeLevel = $attributes['gradeLevel'];
        foreach ($item->level as $level) {
            foreach ($level->file as $file) {
                $csvData .= '"' . trim($gradeLevel) . '"' . ',';
                $csvData .= '"' . trim($level->attributes()->dirname) . '"' . ',';
                $csvData .= '"' . trim($file->attributes()->filename) . '"' . ',';
                $csvData .= '"' . trim($file) . '"' . ',';
                $csvData .= "\n";

            }

        }
        $csvData = trim($csvData, ',');
        $csvData .= "\n";
    }
    return $csvData;
}
于 2013-01-15T23:36:16.173 に答える