0

要素の名前と能力IDしかない場合、次のXMLに能力要素のデフォルト属性値をどのように出力しますか?

たとえば、名前が「steve」でIDが1003の場合、その能力のデフォルト値である「false」をどのように選択して出力しますか。

<Item Id="1">
<Name>Batman</Name>
<Ability Id="3001" Default="true">Super Strength</Ability>
<Ability Id="3002" Default="false">Master martial artist</Ability>
<Ability Id="3003" Default="false">Access to high tech</Ability>
</Item>

<Item Id="2">
<Name>Superman</Name>
<Ability Id="3004" Default="true">Flight</Ability>
<Ability Id="3005" Default="false">Super Strength</Ability>
<Ability Id="3006" Default="false">Super Speed</Ability>
<Ability Id="3007" Default="true">Stamina</Ability>
<Ability Id="3008" Default="false">Invulnerability</Ability>
</Item>

<Item Id="3">
<Name>Spiderman</Name>
<ScopeNotes/> <HistoryNotes/>
<Ability Id="219" Default="false">Super Reflex & Agility</Ability>
<Ability Id="567" Default="true">Spider Sense</Ability>
</Item>

<Item Id="4">
<Name>Steve</Name>
<Ability Id="1007" Default="false">Cake eating</Ability>
<Ability Id="1001" Default="true">Swearing</Ability>
<Ability Id="1002" Default="false">Watching movies</Ability>
<Ability Id="1003" Default="false">Steve</Ability>
</Item>

問題は、各要素が異なる数の能力ノードを持っていることと、名前「スティーブ」が名前と能力ノードの両方に現れることです。

私はphpdomのドキュメントを読み、アイテムをループして名前を取得するために以前に使用しました(たとえば、新しいDOMDocument、ファイルのロード、getElementsByTagName)が、上記で説明したようなことをしようとすると、どのように機能するかを理解するのに苦労しています。

4

1 に答える 1

1

Bob Fincheimerが提案したように、XPathは優れたアプローチであるはずです。次のパスで結果が得られます

//Item[Name="Steve"]/child::Ability[@Id="1003"]/@Default

パスの説明:

  1. //
    ドキュメント内のあらゆる場所でノードを選択します(完全なxmlはわかりません)
  2. Item
    select <Item>-nodes
  3. [Name="Steve"]
    <Name>nodeValueが「Steve」 の子要素を持つノードを選択します
  4. child::Ability
    子ノードを選択します<Ability>
  5. [@Id="1003"]
    Id属性が1003に設定されているノードを選択します
  6. @Default
    デフォルト属性を選択します

指定されたXMLに対して、1つの属性ノードを持つDOMNodeListを返します。(@Default="false")

それの使い方?http://www.php.net/manual/de/domxpath.query.php

デモ:http ://codepad.org/qtgWXFtm

于 2012-09-12T23:10:42.287 に答える