php simplexml查找特定字段的值

时间:2012-04-14 08:49:15

标签: php simplexml

XML,我有:

<?xml version="1.0" encoding="windows-1252" ?> 
    - <Tables>
        - <Table name="I_BOOKING">
            - <Row action="UPDATE" success="Y">
              <Field name="AUTOBOOK">888800</Field> 
              <Field name="TOUROP">01</Field> 
              <Field name="REFERENCE">GSDFFD</Field> 
              <Field name="NBPAX">2</Field> 
              <Field name="NBINF">1</Field> 
              </Row>
      </Table>
      - <Table name="I_EXCDATERESA">
          - <Row action="UPDATE" success="Y">
               <Field name="EXCURS">KNO</Field> 
               <Field name="DATE">2012-04-12</Field> 
               <Field name="BOOKNR">125445</Field> 
               <Field name="NAME">TEST 12/4</Field> 
               <Field name="PICKUPTIME">00:00:00</Field> 
           </Row>
         - <Row action="UPDATE" success="Y">
               <Field name="EXCURS">KNO</Field> 
               <Field name="DATE">2012-04-13</Field> 
               <Field name="BOOKNR">14574575</Field> 
               <Field name="NAME">TEST 13/4</Field> 
               <Field name="PICKUPTIME">00:00:00</Field> 
          </Row>
       </Table>
    </Tables>

当我对待表I_EXCDATERESA时,我需要获取字段BOOKNR的值,因此在此示例中为12544514574575,根据我的行在$autobook处理并加载它:

...

$simplexml = simplexml_import_dom($dom);

foreach ($simplexml->Table as $value)
{
    $tableName = $value->attributes()->name;
    foreach ($value->Row as $value)
    {
        if ($tableName == 'I_EXCDATERESA')
        {
            if ($value->Field->attributes()->name == 'BOOKNR')
            {
            $autoBook = $value->Field; 

这不起作用,$autobook未加载,因为它不在第一个“字段”上,而是在第三个

4 个答案:

答案 0 :(得分:2)

这是XPath的一个很好的用例:

$search = $simplexml->xpath('/Tables/Table[name="I_EXCDATERESA"]/Row/Field[name="BOOKNR"]');

答案 1 :(得分:1)

有很多方法可以解决这种情况

  1. 使用DOM

  2. 在simplexml中使用了属性()函数,该函数已涵盖here

  3. 可能最简单的选择是注意到BOOKNER是每一行中的第三个节点 我会做这样的事情。

    for($ i = 0; $ i&lt; count($ simplexml-&gt; - &gt; children()); $ i ++){     echo $ simplexml-&gt;表[$ i] - &gt;表 - &gt; Field [2]; }

  4. 祝你好运

答案 2 :(得分:1)

测试一下,它对我有用:

foreach ($simplexml->Table as $value)
{
    $tableName = $value->attributes()->name;
    foreach ($value->Row as $value_1)
    {
        if ($tableName == 'I_EXCDATERESA')
        {
            foreach ($value_1->Field as $value_2)
            {
                if ($value_2->attributes()->name == 'BOOKNR')
                {
                    $autoBook = $value_2[0];
                    echo $autoBook;
                }
            }
        }
    }
}

你的问题在于:

 $value->Field->attributes()->name=='BOOKNR'

那太多了:我在elemts Row的每个字段上添加了另一个循环!

答案 3 :(得分:0)

$simplexml->xpath('/Tables/Table[name="I_EXCDATERESA"]/Row/Field[name="BOOKNR"]');

不起作用,你错过了@

$simplexml->xpath('/Tables/Table[@name="I_EXCDATERESA"]/Row/Field[@name="BOOKNR"]');