Foreach children()SimpleXML并没有给我完整的结构

时间:2012-03-20 10:07:42

标签: php xml simplexml

所以我有以下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 :(得分:0)

您可以使用SimpleXml::xpath直接获取这些节点:

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

另请查看此XPath tutorial

答案 1 :(得分:0)

看一下通过xpath提取它;

以下内容将返回所有respcondition节点,其中包含一个conditionvar节点,其中只包含“或”子节点。在你的xml示例中,这不会返回任何内容,我相信你的目标是。

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

或者,如果您想提取respcondition节点,但现在想到“和”子节点,请使用;

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

xpath是一种简单而强大的导航和提取xml文档的方法,如果可能,请使用它。