1

ルート要素と子の両方の名前にコロンが含まれているため、PHP で simpleXML を使用して xml を解析する際に深刻な問題があります。私は多くのソリューションを検索し、機能するソリューションを見つけました。ただし、これらのコロン要素がネストされているため、私の問題はより具体的です。

ご覧のとおり、ルート要素の子要素は 1 から N まで変化します (元の xml のスニペット)。

     <bpmndi:BPMNEdge bpmnElement="sid-96E075E5-D515-46E7-BED2-9A284F1F5153" id="sid-96E075E5-D515-46E7-BED2-9A284F1F5153_gui">
        <omgdi:waypoint x="985.0" y="220.0"/>
        <omgdi:waypoint x="1055.5" y="220.0"/>
        <omgdi:waypoint x="1055.5" y="160.0"/>
     </bpmndi:BPMNEdge>
     <bpmndi:BPMNEdge bpmnElement="sid-F36DC404-7095-4653-8176-FB99ADAB8DEC" id="sid-F36DC404-7095-4653-8176-FB99ADAB8DEC_gui">
        <omgdi:waypoint x="927.0" y="580.0"/>
        <omgdi:waypoint x="1005.0" y="580.0"/>
     </bpmndi:BPMNEdge>

私が現在行ったこと(そして動作します。質問はコードのコメント部分にあります)

$xml->registerXPathNamespace('bpmndi', 'specific-url');
$xml->registerXPathNamespace('omgdi', 'specific-url');
$edges = $xml->xpath('//bpmndi:BPMNEdge');
$point = $xml->xpath('//omgdi:waypont');

$i = 0;
foreach ($edges as $edge) {

echo (string) $edge[0]['bpmnElement'];  
//how to get the children of this element? E.g. 1 or N waypoints and their x and y?
$i++;
}
4

1 に答える 1

2

children()要素を簡単に反復処理できます( http://php.net/simplexmlelement.childrenを参照):

foreach($edge->children('omgdi', true) as $child) {
    echo sprintf("waypoint %s / %s\n", $child->attributes()->x, $child->attributes()->y);
}

を呼び出すときに名前空間を提供する必要がありますchildren()。そうしないと、呼び出しはデフォルトの名前空間の子のみを返します。

于 2013-09-06T15:39:37.827 に答える