PHPのsimpleXmlを使用して、musicxmlファイルを画面上の楽譜として表示しています。スコアのどこかに音部記号の変更がない限り、すべてがうまくいきます。ここでは対策27で音部記号の変更を示すxmlファイルの抜粋です:PHPを使用してxml要素が他の要素との関連でどこにあるかを調べる
<measure number="27">
<note>
</note>
<note>
</note>
<attributes>
<clef number="2">
<sign>F</sign>
<line>4</line>
</clef>
</attributes>
<note>
</note>
<note>
</note>
<note>
</note>
</measure>
私は($ノートとして$ measure->注)foreachのを経由して各小節の音符を通過してい。私はを使って小節の音節変化を検出することができます。(isset($ measure-> attributes-> clef))しかしこれは私にを教えていません。小節の変更が発生します。。この例では最後の3つの音、)
私はsimpleXmlIteratorに見えたが、このケースでSimpleXMLオブジェクトのうち抜粋($対策を処理していないようですが)私が試した:
$sxi = new SimpleXMLIterator($measure);
これは私に以下の警告を与えました:
警告: にSimpleXMLElement :: __構築物():エンティティ:行29:パーサーエラー:I
var_dump($measure)
が、私はそれが最後で音部記号の変更を置くことを確認すると '<'、期待 タグを起動
が見つかりませんノート配列のが、音符の配列中のその適切な場所を決定するために使用することができる数を割り当て:
object(SimpleXMLElement)#21 (4) {
["@attributes"]=>
array(2) {
["number"]=>
string(2) "25"
["width"]=>
string(6) "468.94"
}
["note"]=>
array(25) {
...
[20]=>
object(SimpleXMLElement)#43 (5) {
["rest"]=>
object(SimpleXMLElement)#49 (0) {
}
["duration"]=>
string(1) "4"
}
[21]=>
object(SimpleXMLElement)#45 (7) {
["@attributes"]=>
array(2) {
["default-x"]=>
string(6) "293.75"
["default-y"]=>
string(7) "-255.00"
}
["pitch"]=>
object(SimpleXMLElement)#49 (2) {
["step"]=>
string(1) "D"
["octave"]=>
string(1) "4"
}
["duration"]=>
string(1) "2"
}
}
["attributes"]=>
object(SimpleXMLElement)#44 (1) {
["clef"]=>
object(SimpleXMLElement)#49 (3) {
["@attributes"]=>
array(1) {
["number"]=>
string(1) "2"
}
["sign"]=>
string(1) "G"
["line"]=>
string(1) "2"
}
}
}
オブジェクト#44(音部変化)A、実際に【2つの音の間に来なければなりません休符とメモ]はオブジェクト#43と#45です。だから、もし私がそれらの "オブジェクト番号"にアクセスする方法を理解できれば、私の問題は解決することができます。誰でもこれを行う方法、またはこの問題を解決するためのより良い方法を知っていますか?
感謝、パフェ!これは、私のニーズにさらに便利な何かにXMLを事前にマッサージする新しい可能性を開きます。 – smmcroberts