Foreach children () SimpleXML не дает мне полную структуру - PullRequest
2 голосов
/ 20 марта 2012

Итак, у меня есть следующий XML-файл, в котором меня интересуют только элементы <respcondition>, в которых есть только элемент <or>, а не элемент <and>.

Я пробовал в PHPследующее утверждение:

<!-- language: lang-php -->
foreach ($item->resprocessing->children() as $child) {
  if ((string) $child->getName() == 'respcondition') {
    if ((string) $child->respcondition->children()->getName() == 'conditionvar') {
      if ((string) $child->respcondition->conditionvar->children()->getName() == 'or') {
        $responseID = $child->respcondition->conditionvar->or->varequal->attributes()->respident;
        //some code
      }
    }
  }
}

}

Но я прихожу только к первому IF, поэтому я понял, что children() не содержит весь XML из этого элемента.Есть ли какие-нибудь альтернативы, которые я могу использовать?

<!-- language: lang-xml -->
<resprocessing>
  <outcomes>
    <decvar varname="SCORE" vartype="Decimal" defaultval="0" minvalue="0.0" maxvalue="1.0" cutvalue="1.0"/>
  </outcomes>
  <respcondition continue="Yes" title="Mastery">
    <conditionvar>
      <or>
        <varequal respident="1000006631" case="Yes"><![CDATA[Mars]]></varequal>
      </or>
    </conditionvar>
    <setvar varname="SCORE" action="Add">1.0</setvar>
  </respcondition>
  <respcondition continue="Yes" title="Mastery">
    <conditionvar>
      <or>
        <varequal respident="1000006678" case="Yes"><![CDATA[Jupiter]]></varequal>
      </or>
    </conditionvar>
    <setvar varname="SCORE" action="Add">1.0</setvar>
  </respcondition>  
  <respcondition title="Mastery" continue="Yes">
    <conditionvar>
      <and>
        <or>
          <varequal respident="1000006421" case="Yes"><![CDATA[planets]]></varequal>
        </or>
        <or>
          <varequal respident="1000006468" case="Yes"><![CDATA[sun]]></varequal>
        </or>
        <or>
          <varequal respident="1000006558" case="Yes"><![CDATA[Mercury]]></varequal>
        </or>
      </and>
    </conditionvar>
    <displayfeedback feedbacktype="Response" linkrefid="Mastery"/>
  </respcondition>
</resprocessing>

С уважением

Ответы [ 2 ]

0 голосов
/ 20 марта 2012

Взгляните на распаковку через xpath;

Следующее вернет вам все узлы условного выражения, имеющие узел условного аргумента, в котором есть только "или" дочерние узлы. В вашем примере с xml это ничего не даст, к чему, я полагаю, вы стремитесь.

$xmlDoc->xpath('/resprocessing/respcondition[conditionvar/or]');

Или, если вы хотите извлечь узлы условного выражения, но теперь, имея в виду "и" дочерний узел, используйте;

$xmlDoc->xpath('/resprocessing/respcondition[conditionvar/and/or]');

xpath - это простой и мощный способ навигации и извлечения XML-документа, используйте его, если это возможно.

0 голосов
/ 20 марта 2012

Вы можете использовать SimpleXml::xpath, чтобы получить эти узлы напрямую:

/resprocessing/respcondition[descendant::or and not(descendant::and)]

Также посмотрите этот учебник XPath .

...