使用simplexml_load_string从XML文件获取值

时间:2013-03-16 21:23:47

标签: php xml simplexml

我有以下XML代码

<epp:epp xmlns:epp="urn:ietf:params:xml:ns:epp-1.0">
  <epp:response>
    <epp:result code="1000">
      <epp:msg>Contact Info Command completed successfully</epp:msg>
    </epp:result>
    <epp:resData>
      <contact:infData xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
        <contact:id>con12</contact:id>
        <contact:status s="ok"/>
        <contact:postalInfo type="loc">
          <contact:name>Name</contact:name>
          <contact:org/>
          <contact:addr>
            <contact:street>streer</contact:street>
            <contact:street>street</contact:street>
            <contact:street/>
            <contact:city>City</contact:city>
            <contact:sp/>
            <contact:pc>186</contact:pc>
            <contact:cc>AA</contact:cc>
        </contact:addr>
      </contact:postalInfo>
        <contact:voice>0000000</contact:voice>
        <contact:fax>000000000</contact:fax>
        <contact:email>support@email.com</contact:email>
    </contact:infData>
    </epp:resData>

  </epp:response>
</epp:epp>

我在使用simplexml_load_string

从XML字符串中获取值时遇到了困难

我可以从epp开始的所有节点中获得结果:例如epp:msg uinsg以下代码

$objects = simplexml_load_string($result);
$objects->children('epp', true)->response->result->msg;

我似乎无法获得以下值

<contact:infData xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
        <contact:id>con12</contact:id>
        <contact:status s="ok"/>
        <contact:postalInfo type="loc">
          <contact:name>Name</contact:name>
          <contact:org/>
          <contact:addr>
            <contact:street>streer</contact:street>
            <contact:street>street</contact:street>
            <contact:street/>
            <contact:city>City</contact:city>
            <contact:sp/>
            <contact:pc>186</contact:pc>
            <contact:cc>AA</contact:cc>
        </contact:addr>
      </contact:postalInfo>
        <contact:voice>0000000</contact:voice>
        <contact:fax>000000000</contact:fax>
        <contact:email>support@email.com</contact:email>
    </contact:infData>

我还需要知道如何在<epp:result code="1000">

中获取代码值

任何帮助/指示都将不胜感激,

2 个答案:

答案 0 :(得分:2)

你有99%的路(除非我遗漏了什么)。基本上,只要您想要“更改”命名空间,就可以使用->children()->attributes()方法。

所以你可以说$objects->children('epp', true)->response->result->resData->children('contact', true)->infData->id

code中的<epp:result code="1000">属性为technically not in any namespace at all,因此您必须选择NULL命名空间才能访问它:$objects->children('epp', true)->response->result->attributes(NULL)->code

不要忘记,通过使用别名('epp','contact'),你依赖于不改变它们的数据源,它们在技术上可以不改变文件的“含义”。为了防范这种情况,您必须对URI(urn:ietf:params:xml:ns:epp-1.0urn:ietf:params:xml:ns:contact-1.0)进行硬编码。

答案 1 :(得分:1)

你快到了。以类似的方式访问更深层的元素:

$contact = $objects->children('epp', true)->response->resData->children('contact',tee);
$name = $contact->infData->postalInfo->name;

对于代码值,我假设您的意思是<epp:result code="1000">

$resultAttributes = $objects->children('epp', true)->response->result->attributes();
$code = $resultAttributes['code'];

注意:$ name和$ code最终都是SimpleXMLElements而不是字符串,但你可以将它们转换为字符串:

$a = (string)$name;