【问题标题】:SimpleXML namespaces and attributesSimpleXML 命名空间和属性
【发布时间】:2014-06-15 14:46:45
【问题描述】:

我有一个如下所示的 xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd">
    <response>
        <result code="1001">
            <msg>Command completed successfully; action pending</msg>
            <extValue>
            <value xmlns:epp="urn:ietf:params:xml:ns:epp-1.0">
            <epp:undef/>
            </value>
            <reason>200 Command completed successfully</reason>
            </extValue>
        </result>
        <extension>
            <keyvalue:extension xmlns:keyvalue="http://schema.ispapi.net/epp/xml/keyvalue-1.0"
            xsi:schemaLocation="http://schema.ispapi.net/epp/xml/keyvalue-1.0 keyvalue-1.0.xsd">
                <keyvalue:kv key="APPLICATION" value="3725"/>
                <keyvalue:kv key="AUTH" value="ZBh5ralfPl"/>
                <keyvalue:kv key="CLASS" value="APP_EOI"/>
                <keyvalue:kv key="CREATEDBY" value="SYSTEM"/>
                <keyvalue:kv key="CREATEDDATE" value="2012-09-03 09:47:10"/>
                <keyvalue:kv key="DOMAIN" value="example2.app"/>
                <keyvalue:kv key="DOMAINUMLAUT" value="example2.app"/>
                <keyvalue:kv key="PEERUSER" value=""/>
                <keyvalue:kv key="STATUS" value="REQUESTED"/>
                <keyvalue:kv key="UPDATEBY" value="SYSTEM"/>
                <keyvalue:kv key="UPDATEDDATE" value="2012-09-03 09:47:10"/>
                <keyvalue:kv key="USER" value="test.user"/>
            </keyvalue:extension>
        </extension>
        <trID>
        <svTRID>RW-22720-1346665630348630</svTRID>
        </trID>
    </response>
</epp>

我正在尝试遍历键值,直到找到具有 APPLICATION 键的键值。 这就是我目前所拥有的

$xml = new SimpleXMLElement($response);
$namespaces = $xml->getNamespaces(true);
$nodes = $xml->response->extension->children($namespaces["keyvalue"])->extension->children($namespaces["keyvalue"])->children();
print_r($nodes);

返回

SimpleXMLElement 对象 ( [@attributes] => 数组 ( [关键] => 应用 [价值] => 3725 )

)

但我不能在 $nodes 或 $nodes[0] 上调用 attributes() 方法,因为它会引发警告或返回空元素。

你能指导我正确的方向吗?

谢谢

【问题讨论】:

    标签: php simplexml


    【解决方案1】:

    使用

    ->children();
    

    最后,即使用默认命名空间,将为您提供零元素的子集合。由于它是空的,SimpleXML 在内部运行一些优化。再次访问它可能会导致错误:

    $nodes->attributes()['value']
    

    警告:main():节点不再存在于 ...

    也许最好的方法是把它去掉,然后给你要找的孩子起名字:

    $nodes = ... ->extension->children($namespaces["keyvalue"])->kv;
    
    print_r($nodes[1]->attributes()['value']);
    

    给出这个输出:

    SimpleXMLElement Object
    (
        [0] => ZBh5ralfPl
    )
    

    因为它是第二个 &lt;kv&gt; 元素(从零开始),其中的属性 "value" 被访问。

    如果您想将具体元素排除在外,只需将其排除在外(not 添加-&gt;children())。同样的例子:

    $nodes = $xml->response->extension->children($namespaces["keyvalue"])->
                   extension->children($namespaces["keyvalue"]);
    
    print_r($nodes[1]->attributes()['value']);
    

    这给出了完全相同相同的输出:

    SimpleXMLElement Object
    (
        [0] => ZBh5ralfPl
    )
    

    因为那里只有 &lt;kv&gt; 元素作为子元素,所以编号不会改变。

    希望这有助于阐明一些问题。也许比这一切更好的是使用 xpath:

    $xml->registerXPathNamespace('kv', $namespaces["keyvalue"]);
    
    var_dump($xml->xpath('//kv:kv[@key = "AUTH"]/@value')[0]);
    

    这给出了:

    class SimpleXMLElement#6 (1) {
      public $@attributes =>
      array(1) {
        'value' =>
        string(10) "ZBh5ralfPl"
      }
    }
    

    Xpath 专门用于遍历。这在命名空间方面会更好。

    【讨论】:

      猜你喜欢
      • 2012-11-10
      • 2020-04-19
      • 2011-06-08
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多