2

XMLファイルがあります。

<key>457</key>
    <dict>
        <key>Track ID</key><integer>457</integer>
        <key>Name</key><string>Love me do</string>
        <key>Artist</key><string>The Beatles</string>
        <key>Album Artist</key><string>The Beatles</string>
        <key>Composer</key><string>John Lennon/Paul McCartney</string>
        <key>Album</key><string>The Beatles No.1</string>
        <key>Genre</key><string>Varies</string>
        <key>Kind</key><string>AAC audio file</string>
</dict>

これらの目的のために、多くのファイルを削除しました (これは 1 曲で、1 曲あたり約 20 ~ 30 行の XML があります)。私がやりたいのは、各曲から「アーティスト」文字列を抽出し、繰り返される文字列をすべて削除してから、それを取得して HTML ファイルに出力することです。できれば、.xml の新しいバージョンが見つかったときに自動更新して、更新されたファイルを保持する方法で行いますが、それが複雑すぎる場合は問題ありません。

jQueryでそれを行う方法を調べ、PHPを提案しましたが、どれがより良い/よりクリーンかはわかりません。そして、どちらかでそれを行う方法がわかりません。

どうもありがとう、

ヘンリー。

4

2 に答える 2

1

正確に何を達成しようとしていますか?XML ファイルに基づいて定期的に再生成される HTML ファイルが必要な場合は、そのためのプログラムを作成し (たとえば、BeautifulSoup Python ライブラリを使用すると、XML/HTML ファイルを非常に簡単に解析できます)、毎回実行する必要があります。 HTML ファイルを更新する必要があります (そのための cron ジョブを設定することもできます)。

その場で XML からデータを取得できるようにする必要がある場合は、JavaScript ライブラリを使用して XML ファイルから XML をロードし、ページに動的に追加することができます。

たとえば、この Python プログラムは XML ファイル (file.xml) を解析し、XML ファイルのデータを含む HTML ファイル (song_information.html) を作成します。

from BeautifulSoup import BeautifulStoneSoup

f = open("file.xml")
soup = BeautifulStoneSoup(f.read())
f.close()

html = """<!DOCTYPE html>
<html>
<head>
<title>Song information</title>
</head>
<body>
"""

for key in soup.dict.findAll('key'):
    html += "<h1>%s</h1>\n" % key.contents[0]
    html += "<p>%s</p>\n" % key.nextSibling.contents[0]

html += """</body>
</html>
"""

f = open("song_information.html", "w")
f.write(html)
f.close()

次の HTML を song_information.html ファイルに書き込みます。

<!DOCTYPE html>
<html>
<head>
<title>Song information</title>
</head>
<body>
<h1>Track ID</h1>
<p>457</p>
<h1>Name</h1>
<p>Love me do</p>
<h1>Artist</h1>
<p>The Beatles</p>
<h1>Album Artist</h1>
<p>The Beatles</p>
<h1>Composer</h1>
<p>John Lennon/Paul McCartney</p>
<h1>Album</h1>
<p>The Beatles No.1</p>
<h1>Genre</h1>
<p>Varies</p>
<h1>Kind</h1>
<p>AAC audio file</p>
</body>
</html>

もちろん、これは単純化されています。Unicode サポートを実装する必要がある場合は、次のように編集します。

from BeautifulSoup import BeautifulStoneSoup
import codecs

f = codecs.open("file.xml", "r", "utf-8")
soup = BeautifulStoneSoup(f.read())
f.close()

html = """<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Song information</title>
</head>
<body>
"""

for key in soup.dict.findAll('key'):
    html += "<h1>%s</h1>\n" % key.contents[0]
    html += "<p>%s</p>\n" % key.nextSibling.contents[0]

html += """</body>
</html>
"""

f = codecs.open("song_information.html", "w", "utf-8")
f.write(html)
f.close()

また、おそらくより複雑な HTML を生成する必要があるため、Jinja2などのテンプレート システムを試してみることをお勧めします。

于 2012-04-09T11:58:27.933 に答える
1

PHP でこれを行います: XML を文字列に入れ、(これを使用するのはあなただけなので)、JSON にエンコードし、連想配列にデコードし、foreach ループを実行してアーティストを抽出し、最後に重複を削除し、HTML として保存します。次に、cron ジョブを追加してこれを定期的に実行し、HTML を生成できます。このコードを実行し、表示される結果にリンクします。

$contents = '<key>Blah.... lots of XML';

$xml = simplexml_load_string($contents);
$json = json_encode($xml);
$array = json_decode($json, true);

print_r($array);

生成される配列の構造がわかれば、コードを完成させることができます。しかし、それは次のようになります。

foreach($array['dict']['artist'] as $artist) {
    $artists[] = $artist;
}

// Now $artists holds an array of the artists

$arists = array_unique($artists);

// Now there are no duplicates

foreach($artists as $artist) {
    $output .= '<p>',$artist,'</p>';
}

// Now each artist is put in it's own paragraph.

// Either output the output
echo $output;

// Or save it to a file (in this case, 'artists.html')

$fh = fopen('artists.html', 'w') or die("Can't open file");
fwrite($fh, $output);
fclose($fh);

foreach最初のループの行を少し調整する必要があるため、これは完全には機能しませんが、これは出発点です。

于 2012-04-09T12:07:07.303 に答える