';随机';在PHP中访问XML(带名称空间)节点的子节点
这是我关于堆栈溢出的第一篇文章,我必须说我发现这个网站是一个答案的金矿! 所以,第一篇文章有点不着边际——有很多关于这个主题的答案,但似乎不适合我的具体问题。使用名称空间访问XML的代码工作正常,非常整洁,因此可能会帮助任何试图了解这一点的人 我正在读取一个XML文件:';随机';在PHP中访问XML(带名称空间)节点的子节点,php,xml,xpath,namespaces,children,Php,Xml,Xpath,Namespaces,Children,这是我关于堆栈溢出的第一篇文章,我必须说我发现这个网站是一个答案的金矿! 所以,第一篇文章有点不着边际——有很多关于这个主题的答案,但似乎不适合我的具体问题。使用名称空间访问XML的代码工作正常,非常整洁,因此可能会帮助任何试图了解这一点的人 我正在读取一个XML文件: <?xml version='1.0'?> <epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:domain="urn:ietf:params:xml:ns:do
<?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>
命令已成功完成
foo.com
foo.net
登记
foo.org
未知的
食品管道
c:类别7
foo.uk
有资格的
食品管道
6f2d7447511677c62631e4bdb9563172
测试-da76f89aacec9861b89bf093fc120566
我希望能够访问域: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>';
}
$xml=simplexml\u load\u string($return\u 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');
//我可以很好地列出domain:name元素和属性。
foreach($xml->xpath('//domain:name')作为$domain){
echo“域:”.$Domain.“
”;//有效
回显“可用代码:”.$domain['avail'].
;//有效
回声“”;
}
//然后我可以列出域:reason元素。
foreach($xml->xpath('//domain:reason')作为$reason){
回显“Reason:”.$Reason.
“;//有效
回声“”;
}
//但我想要的是,能够从同一个节点按照我需要的顺序访问它们。
//有点像这样,这样我可以形成一些内容。
$res=$xml->xpath('//domain:cd');
foreach($res->children()作为$node){
echo'Name:'.$node['domain:Name'].
;//注意,这是错误的。
回显“原因:”。$node['domain:Reason'].
;//注意,这是错误的。
回声“”;
}
必须运行单独的xpath查询来获取每一位数据似乎有点浪费和麻烦,我应该能够访问节点的子节点(domain:name,domain:reason),但解决方案有点难以捉摸,特别是名称空间的额外复杂性
谢谢大家。:) 谢谢你,鬼魂
我设法想出了下面的方法,这样我就可以按随机顺序而不是按顺序取出数据
$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>';
}
$res=$xml->xpath('//domain:cd');
foreach($res作为$node){
$namespaces=$node->getNameSpaces(true);
$cd=$node->children($namespace['domain']);
回显“”.$cd->name.“
”;
echo$cd->原因。“”;
}
呸,它总是在你在论坛上发布一个问题后出现,不是吗 当然没问题。你能回答自己的问题还是很好的。