php - 在 PHP 中“随机”访问 XML(带有命名空间)节点的子节点

标签 php xml xpath namespaces children

这是我在 Stack Overflow 上的第一篇文章,我不得不说我发现这个网站是答案的金矿!
所以,第一篇文章有​​点笨拙 - 有很多关于大致主题的答案,但似乎无法适合我的确切问题。使用命名空间访问 XML 的代码有效并且非常简洁,因此可能会帮助任何试图弄清楚这一点的人......

我有一个正在阅读的 XML 文件:

<?xml version='1.0'?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:domain="urn:ietf:params:xml:ns:domain-1.0" xmlns:ext-domain="http://www.heartinternet.co.uk/whapi/ext-domain-2.4">
  <response>
    <result code='1000'>
      <msg>Command completed successfully</msg>
    </result>
    <resData>
      <domain:chkData>
        <domain:cd>
          <domain:name avail="1">foo.com</domain:name>
        </domain:cd>
        <domain:cd>
          <domain:name avail="0">foo.net</domain:name>
          <domain:reason>registered</domain:reason>
        </domain:cd>
        <domain:cd>
          <domain:name avail="0">foo.org</domain:name>
          <domain:reason>unknown</domain:reason>
        </domain:cd>
        <domain:cd>
          <domain:name avail="0">foo.plumbing</domain:name>
          <domain:reason>c:category7</domain:reason>
        </domain:cd>
        <domain:cd>
          <domain:name avail="1">foo.uk</domain:name>
          <domain:reason>qualified</domain:reason>
        </domain:cd>
      </domain:chkData>
    </resData>
    <extension>
      <ext-domain:categorisedChkData>
        <ext-domain:cd>
          <ext-domain:name price="1050.37">foo.plumbing</ext-domain:name>
        </ext-domain:cd>
      </ext-domain:categorisedChkData>
    </extension>
    <trID>
      <clTRID>6f2d7447511677c62631e4bdb9563172</clTRID>
      <svTRID>test-da76f89aacec9861b89bf093fc120566</svTRID>
    </trID>
  </response>
</epp>

我希望能够访问域的子级:cd。
请参阅下面代码中的注释
$xml = simplexml_load_string($return_xml, NULL, NULL, "urn:ietf:params:xml:ns:epp-1.0");
$xml->registerXPathNamespace('domain', 'urn:ietf:params:xml:ns:domain-1.0');
$xml->registerXPathNamespace('ext-domain', 'http://www.heartinternet.co.uk/whapi/ext-domain-2.4');

// I can list out the domain:name elements and attributes nicely.
foreach ($xml->xpath('//domain:name') as $domain){
    echo '<p>Domain: '.$domain.'<br/>';                 // Works
    echo 'avail-code: '.$domain['avail'].'<br/>';       // Works
    echo '</p>';
}

// And I can list out the domain:reason elements afterwards.
foreach ($xml->xpath('//domain:reason') as $reason){
    echo '<p>Reason: '.$reason.'<br/>';                 // Works
    echo '</p>';
}

// But what I want, is to be able to get to them both from the same node in the order I need them.
// A little like this, so that I can form some content.
$res = $xml->xpath('//domain:cd');
foreach ($res->children() as $node){
    echo '<p>Name: '.$node['domain:name'].'<br/>';      // this is wrong, mind.
    echo 'Reason: '.$node['domain:reason'].'<br/>';     // this is wrong, mind.
    echo '</p>';
}

必须运行单独的 xpath 查询来获取每一位数据似乎有点浪费和繁琐,我应该能够访问节点的子节点(域:名称,域:原因),但解决方案有点难以捉摸,尤其是使用命名空间的额外复杂性。

谢谢各位。 :)

最佳答案

谢谢,幽灵。

我设法想出了以下内容,尽管这让我可以按随机顺序而不是按顺序提取数据。

$res = $xml->xpath('//domain:cd');
foreach ($res as $node){            
    $namespaces = $node->getNameSpaces(true);
    $cd         = $node->children($namespaces['domain']);

    echo '<p>'. $cd->name.'<br/>';
    echo        $cd->reason.'</p>';
}

呸,它总是在您在论坛上发布问题后才出现,不是吗!

关于php - 在 PHP 中“随机”访问 XML(带有命名空间)节点的子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27965211/

相关文章:

php - 比较字符串,在 PHP 中使用 == 包含空格

php - IF语句中括号的区别是什么?

python - 如何在Python中添加包含 ":"的xml标签

xpath - 如何获取Span Table第n列匹配文本的元素数

php - 根据用户的角色和状态登录 laravel

php - 我的 Eclipse/Ajax/MySQL/PHP 不工作,因为 PHP 文件似乎永远不会执行。为什么?

java - 如何使用apache通用配置加载多个配置文件(java)

c++ - 用于读取和写入 vector 图形的库 - 轮询 x,y 颜色

php - 提取html代码中的两个字符串

python - 无效选择器错误 : Webscraping different kinds of text from multiple spans using xpath and Selenium