在PHP中解析嵌套名称空间XML中的元素
到目前为止,我得到的是下面的代码。 我认为问题在于在PHP中解析嵌套名称空间XML中的元素,php,xml,xpath,xml-namespaces,Php,Xml,Xpath,Xml Namespaces,到目前为止,我得到的是下面的代码。 我认为问题在于$bodies=$xml->xpath('domain:cd'),, 我不知道如何定义路径 尝试查看一些示例,但没有找到答案 XML “alitheia”回音用于调试,以查看我的代码到达了哪里。“Alitheia2”从未出现过 代码,以防其他人提出此问题 //i loaded the xml in the p2xml variable using file_get_contents $p2xml = new SimpleXmlEl
$bodies=$xml->xpath('domain:cd')代码>,,
我不知道如何定义路径
尝试查看一些示例,但没有找到答案
XML
“alitheia”回音用于调试,以查看我的代码到达了哪里。“Alitheia2”从未出现过
代码,以防其他人提出此问题
//i loaded the xml in the p2xml variable using file_get_contents
$p2xml = new SimpleXmlElement($p2xmlf);
foreach ($p2xml->response->resData $entry2)
{
$namespaces = $entry2->getNameSpaces(true);
$dc = $entry2->children($namespaces['domain']);
$nameout = $dc->chkData->name;
//below is what i used to get the attribute
$attrout = $dc->chkData->name->attributes();
$oxml = $p2xml->asXML();
}
您的代码有两个问题:
同时注册并使用urn:ietf:params:xml:ns:epp-1.0
命名空间:
$xml->registerXPathNamespace('epp', 'urn:ietf:params:xml:ns:epp-1.0');
并在XPath表达式中使用它:epp:resData
而不是resData
没有
根元素。如果要查找所有这些数据,请使用//epp:resData/domain:chkData
,或提供完整路径:/epp:epp/epp:resData/domain:chkData
如果您只需要名称,为什么不使用XPath直接选择它呢
$bodies = $xml->xpath('//epp:resData/domain:chkData/domain:cd/domain:name/text()');
// Or even use: '//domain:name/text()'
foreach ($bodies as $body)
echo $body;
您的代码有两个问题:
同时注册并使用urn:ietf:params:xml:ns:epp-1.0
命名空间:
$xml->registerXPathNamespace('epp', 'urn:ietf:params:xml:ns:epp-1.0');
并在XPath表达式中使用它:epp:resData
而不是resData
没有
根元素。如果要查找所有这些数据,请使用//epp:resData/domain:chkData
,或提供完整路径:/epp:epp/epp:resData/domain:chkData
如果您只需要名称,为什么不使用XPath直接选择它呢
$bodies = $xml->xpath('//epp:resData/domain:chkData/domain:cd/domain:name/text()');
// Or even use: '//domain:name/text()'
foreach ($bodies as $body)
echo $body;
您做得很好,唯一不匹配的是元素的路径:
/resData/domain:chkData
这是您的路径,它意味着
将是根(文档)元素的子元素。但它不是,它是
的子元素,它本身是根元素的子元素:
/response/resData/domain:chkData'
#########
通过这一小小的更改,您的代码就可以正常工作。您做得很好,唯一不匹配的是元素的路径:
/resData/domain:chkData
这是您的路径,它意味着
将是根(文档)元素的子元素。但它不是,它是
的子元素,它本身是根元素的子元素:
/response/resData/domain:chkData'
#########
通过这一小小的更改,您的代码就可以正常工作。您的XML已损坏,缺少两个结束标记。如果您使用的是调试输出,最好使用合理的输出,如var\u dump($body)代码>。它会帮助您意识到XPath表达式错误/没有返回任何内容。您的XML已损坏,缺少两个结束标记。如果您使用的是调试输出,最好使用合理的输出,如var\u dump($body)代码>。它会帮助您意识到XPath表达式是错误的/没有返回任何内容。是必需的/有效的,因为在他的示例中,名称空间是用simplexml_load_string指定为默认值的。好的,现在进行测试,这样我就不那么懒了,并添加了一个答案,这真的没有必要,OP做得很好:我不认为1。是必需的/有效的,因为该名称空间在他的示例中使用simplexml\u load\u字符串指定为默认名称空间。好的,现在进行测试,这样我就不会那么懒了,并添加了一个答案,这真的没有必要,OP做得很好:感谢您的兴趣和时间。我把我的答案贴在上面(编辑了这个问题)。谢谢你的关注和时间。我把我的答案贴在上面(编辑了问题)。