读取 XML 中具有命名空间和load_file的 XML 文件

read xml file with namespace and load_file in xml

提问人:marco 提问时间:11/7/2023 最后编辑:marco 更新时间:11/8/2023 访问量:64

问:

我正在尝试使用xml_loadfile读取xml文件。 xml 文件包含命名空间,我可以用 xmlload_string 读取它,但是当我使用 loadfile 时它不起作用。 XML 存储在我的服务器上。

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <exp:Input xmlns:exp="http://xps.com">
            <exp:serviceId>namesurname</exp:serviceId>
            <exp:data>
                <exp:xml>coded</exp:xml>
              
            </exp:data>
        </exp:Input>
    </soapenv:Body>
</soapenv:Envelope>


我试过了

    <?php
    $xmlFilePath = 'xml/2.xml';
    
    $xml = simplexml_load_file($xmlFilePath);
    
    $namespaces = $xml->getNamespaces(true);
    
    $exp = $xml->children($namespaces['exp']);
    
    $serviceId = $exp->Input->serviceId;
    
    echo $serviceId;
    ?>

但屏幕上不显示任何内容

我需要读取名为serviceId的子项

PHP XML 解析

评论

0赞 KIKO Software 11/7/2023
这是您收到的完整错误消息吗?请始终复制完整的消息,这样我们就不必猜测它是什么。
0赞 Rob Eyre 11/7/2023
您尚未共享错误的全文,但我猜对 simplexml_load_file 的调用返回了 .我认为这可能是因为无法打开文件,或者XML中存在错误。由于您已经能够将其加载为字符串,这听起来像是文件路径或文件权限问题。错误日志告诉您什么?false
0赞 marco 11/7/2023
@Rob Eyre 我更新了 xml
0赞 marco 11/7/2023
@KIKO 软件已更新。
0赞 KIKO Software 11/7/2023
好的,Rob Eyre 的假设是正确的:返回.打开错误报告或检查错误日志。simplexml_load_file($xmlFilePath);false

答:

0赞 KIKO Software 11/8/2023 #1

接受挑战。不,但你是对的,如果没有轻微的摆弄,我就无法做到这一点:

$xmlFilePath = 'xml/2.xml';
$content = file_get_contents($xmlFilePath);
$content = str_replace(['soapenv:', 'exp:'], '', $content);
$xml = new SimpleXMLElement($content);
$serviceId = $xml->Body->Input->serviceId;
echo $serviceId;

演示:https://3v4l.org/aqquM

通过替换 and,我可以将输入作为普通 XML 处理,而无需担心命名空间。soapenv:exp:

然而,PHP中有真正的SoapClient(),但我没有尝试过,因为我怀疑我没有关于你的SOAP响应的所有信息。

评论

0赞 marco 11/8/2023
谢谢完美工作!