【问题标题】:Problems parsing xml with PHP and SimpleXML使用 PHP 和 SimpleXML 解析 xml 的问题
【发布时间】:2015-05-11 04:06:20
【问题描述】:

我正在尝试解析来自 Ontraport API 的响应,该响应以丑陋的 XML 格式返回。

<result>
    <contact id="1" date="1424746532" dlm="1425357692" score="0.00" purl="" bulk_mail="1">
        <Group_Tag name="Contact Information">
            <field name="Company">Test.com</field>
            <field name="Email">test@test.com</field>
            <field name="Group"/>
            <field name="Specialty"/>
            <field name="User ID"/>
            <field name="Display First"/>
            <field name="Display Last"/>
        </Group_Tag>
    </contact>
</result>

我正在使用SimpleXMLsimplexml_load_string 函数。当我 var_dump 来自该函数的响应时,我得到以下输出:

object(SimpleXMLElement)#1 (1) {
  ["contact"]=>
  object(SimpleXMLElement)#2 (2) {
    ["@attributes"]=>
    array(6) {
      ["id"]=>
      string(1) "1"
      ["date"]=>
      string(10) "1424746532"
      ["dlm"]=>
      string(10) "1425357692"
      ["score"]=>
      string(4) "0.00"
      ["purl"]=>
      string(0) ""
      ["bulk_mail"]=>
      string(1) "1"
    }
    ["Group_Tag"]=>
    object(SimpleXMLElement)#3 (2) {
      ["@attributes"]=>
      array(1) {
        ["name"]=>
        string(19) "Contact Information"
      }
      ["field"]=>
      array(7) {
        [0]=>
        string(8) "Test.com"
        [1]=>
        string(13) "test@test.com"
        [2]=>
        object(SimpleXMLElement)#4 (1) {
          ["@attributes"]=>
          array(1) {
            ["name"]=>
            string(5) "Group"
          }
        }
        [3]=>
        object(SimpleXMLElement)#5 (1) {
          ["@attributes"]=>
          array(1) {
            ["name"]=>
            string(9) "Specialty"
          }
        }
        [4]=>
        object(SimpleXMLElement)#6 (1) {
          ["@attributes"]=>
          array(1) {
            ["name"]=>
            string(7) "User ID"
          }
        }
        [5]=>
        object(SimpleXMLElement)#7 (1) {
          ["@attributes"]=>
          array(1) {
            ["name"]=>
            string(13) "Display First"
          }
        }
        [6]=>
        object(SimpleXMLElement)#8 (1) {
          ["@attributes"]=>
          array(1) {
            ["name"]=>
            string(12) "Display Last"
          }
        }
      }
    }
  }
}

我如何检索公司和电子邮件值,或从那里检索任何特定字段,我不知道它们是空的还是有值。

我看不到那些有值的字段名称,我不能假设字段顺序。

编辑:我不认为这是 @Rizier123 所说的重复,因为我正在尝试基于元素属性检索项目,而我什至没有进入var_dump 具有值的字段的属性。因此,针对该其他问题的建议和接受的解决方案不适用于此处。 正如他所问的,我正在添加我用来测试这个的完整和真实的代码:

$response = '<result>
    <contact id="1" date="1424746532" dlm="1425357692" score="0.00" purl="" bulk_mail="1">
        <Group_Tag name="Contact Information">
            <field name="Company">Test.com</field>
            <field name="Email">test@test.com</field>
            <field name="Group"/>
            <field name="Specialty"/>
            <field name="User ID"/>
            <field name="Display First"/>
            <field name="Display Last"/>
        </Group_Tag>
    </contact>
</result>';
$responseData = simplexml_load_string($response);
var_dump($responseData);

【问题讨论】:

  • @Rizier123 我不认为这是重复的,因为我正在尝试基于元素属性检索项目,而我什至没有进入 var_dump 字段的属性有一个价值。因此,针对其他问题提出和接受的解决方案不适用于此处。
  • 那么请同时附上如何获取 xml 以及如何打印的代码! (您的完整真实代码)
  • @Rizier123 完成。我不认为它增加了任何有趣的东西,但我添加了它。它是我的 完整真实 代码,因为我首先要做一个最简单的测试。
  • 您是否尝试循环通过“字段”数组并使用 $field[n]->attributes() 获取属性?它会返回任何东西吗?

标签: php xml simplexml


【解决方案1】:

正如@luciano 在评论中建议的那样,我使用$field[n]-&gt;attributes() 修复了这个通过field 数组迭代的问题

当您使用print_r()var_dump() 或任何尝试将值转换为字符串的函数时,SimpleXML 不会同时显示任何元素的属性和文本。 SimpleXML 的get_properties 处理程序位于 中,例如,尽管@attributes 不可访问,但将其显示为属性。

从一个元素中检索属性和文本的唯一方法是遍历它并使用$field-&gt;attributes() 和转换为字符串的$field 手动询问每个元素。

我的案例的最终代码是:

$responseData = simplexml_load_string($response);
$fields = $responseData->contact[0]->Group_Tag->field;
foreach ($fields as $field) {
    printf("%s : %s \n\r",
        $field->attributes()->name,
        $field);
}

【讨论】:

  • 属性也可以通过 ArrayAccess 访问,即$field['name'] 将为您提供所代表元素节点的 name 属性值通过$field。它可能比 $field-&gt;attributes()-&gt;name 短一点,它允许您指定要查找的属性的名称空间(在您的示例中未使用)。 --- 而$responseData-&gt;contact[0]-&gt;Group_Tag-&gt;... 中的[0] 是多余的,因为当您深入遍历时,会自动获取第一个元素。仅供参考。 --- 最重要的是:不要使用 var_dumpprint_r,只需使用 echo $xml-&gt;asXML(); 并查看 XML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多