Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中解析嵌套名称空间XML中的元素_Php_Xml_Xpath_Xml Namespaces - Fatal编程技术网

在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做得很好:感谢您的兴趣和时间。我把我的答案贴在上面(编辑了这个问题)。谢谢你的关注和时间。我把我的答案贴在上面(编辑了问题)。