1

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>

当我处理 tableI_EXCDATERESA时,我需要获取 Field 的值BOOKNR,所以125445或者14574575在这个例子中,根据我正在处理的行并将其加载$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

4 回答 4

2

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

$search = $simplexml->xpath('/Tables/Table[name="I_EXCDATERESA"]/Row/Field[name="BOOKNR"]');
于 2012-04-14T10:26:36.177 回答
1

有几种方法可以解决这种情况

  1. 使用DOM

  2. 使用这里介绍的 simplexml 中的 attribute() 函数

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

    for ($i = 0; $i < count($simplexml->->children()); $i++){ echo $simplexml->Table[$i]->Table->Field[2]; }

祝你好运

于 2012-04-14T09:51:24.803 回答
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'

这太过分了:我在每个元素行的字段上添加了另一个循环!

于 2012-04-14T10:09:58.337 回答
0
$simplexml->xpath('/Tables/Table[name="I_EXCDATERESA"]/Row/Field[name="BOOKNR"]');

不起作用,你错过了@

$simplexml->xpath('/Tables/Table[@name="I_EXCDATERESA"]/Row/Field[@name="BOOKNR"]');
于 2013-09-18T08:25:11.643 回答