使用 PHP 解析 xml 子项和命名空间

Parse xml child and namespace with PHP

提问人:dv2023it79 提问时间:11/6/2023 最后编辑:dv2023it79 更新时间:11/6/2023 访问量:112

问:

我需要从以下xml中读取特定的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://exportservice.domest.sogei.it">
            <exp:serviceId>Send item text</exp:serviceId>
            <exp:data>
                <exp:xml>textcontent</exp:xml>
                <exp:dichiarante>AXB17735</exp:dichiarante>
            </exp:data>
        </exp:Input>
    </soapenv:Body>
</soapenv:Envelope>

我需要的是读取子 SERVICEID

我尝试过使用 xpath,但没有解决方案......有什么帮助吗? 我看到你们中的一些人使用了阵列......

谢谢

我想避免数组并使用对子 exp:serviceid 的简单调用...可能?

PHP XML格式

评论

1赞 Álvaro González 11/6/2023
传统的解决方案是SOAP扩展。这是你的选择吗?(更新:嗯,当然,你在响应正文中仍然有命名空间)。
0赞 dv2023it79 11/6/2023
有什么帮助如何使用它吗?也许举个例子?
1赞 Álvaro González 11/6/2023
命名空间处理示例位于 stackoverflow.com/questions/44894426/...。关于SOAP,如果你不理解官方文档,我相信有教程。

答:

0赞 Lalit Kumar 11/6/2023 #1
<?php 
$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://exportservice.domest.sogei.it">
            <exp:serviceId>Send item text</exp:serviceId>
            <exp:data>
                <exp:xml>textcontent</exp:xml>
                <exp:dichiarante>AXB17735</exp:dichiarante>
            </exp:data>
        </exp:Input>
    </soapenv:Body>
</soapenv:Envelope>';

$xmlObject = simplexml_load_string($xml);
$namespaces = $xmlObject->getNamespaces(true); // get namespaces

// Navigate through the XML
$body = $xmlObject->children($namespaces['soapenv'])->Body;
$input = $body->children($namespaces['exp'])->Input;

$serviceId = (string) $input->serviceId;
$data = $input->data->children($namespaces['exp']);
$xmlContent = (string) $data->xml;
$dichiarante = (string) $data->dichiarante;

echo "Service ID: $serviceId\n";
echo "XML Content: $xmlContent\n";
echo "Dichiarante: $dichiarante\n";
?>

检查此代码

评论

0赞 dv2023it79 11/6/2023
错误:无法创建对象
0赞 dv2023it79 11/6/2023
对这个例子有什么帮助吗> 这对我有很大帮助。非常感谢朋友们
0赞 Lalit Kumar 11/6/2023
@dv2023it79我更新了代码,请立即检查
0赞 dv2023it79 11/6/2023
只有当我想使用 $xml = simplexml_load_file(“filename.xml”) 从服务器读取相同的 XML 文件时,我才会遇到问题
0赞 dv2023it79 11/6/2023
我读到加载的文件不允许你的例子......我们应该使用 XPath...有什么帮助吗?
0赞 AztecCodes 11/6/2023 #2

PHP 读取 XML 字符串问题

应采取的措施:

  1. 加载 XML 文件:用于将 XML 字符串加载到对象中。simplexml_load_stringSimpleXML
  2. 注册命名空间:您需要将此命名空间注册到对象,才能正确查询该命名空间中的元素。SimpleXML
  3. 使用 XPath 进行查询:用于查询元素。XPathexp:serviceId

示例代码:

<?php
// XML content
$xmlContent = <<<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://exportservice.domest.sogei.it">
            <exp:serviceId>Send item text</exp:serviceId>
            <exp:data>
                <exp:xml>textcontent</exp:xml>
                <exp:dichiarante>AXB17735</exp:dichiarante>
            </exp:data>
        </exp:Input>
    </soapenv:Body>
</soapenv:Envelope>
XML;

// Loading the XML
$xml = simplexml_load_string($xmlContent);

// Registering the said namespace
$xml->registerXPathNamespace('exp', 'http://exportservice.domest.sogei.it');

// Querying the exp:serviceId element
$serviceIdElements = $xml->xpath('//exp:serviceId');

// Extracting the wanted value. If-Else Condition.
if (!empty($serviceIdElements)) {
    $serviceId = (string) $serviceIdElements[0];
    echo "Service ID: " . $serviceId;
} else {
    echo "Service ID not found";
}
?>

更新:

如果服务器上存储了文件,则可以选择利用而不是直接从文件加载 XML 数据。下面是修改代码以从文件中检索内容的方法。XMLsimplexml_load_filesimplexml_load_stringXML

调整后的代码:

<?php
// Replace 'path/to/your/xmlfile.xml' with your path to your XML file.
$xmlFilePath = 'path/to/your/xmlfile.xml';

$xml = simplexml_load_file($xmlFilePath);

$namespaces = $xml->getNamespaces(true);

$exp = $xml->children($namespaces['exp']);

$serviceId = $exp->Input->serviceId;

echo $serviceId;
?>

请确保将 替换为服务器上 your 的实际路径。此脚本假定 PHP 进程可以访问和读取 XML 文件。/path/to/your/file.xmlXML file

如果遇到无法正常运行的问题,需要考虑的一些潜在原因是:simplexml_load_file

  • 文件路径可能不正确。
  • 文件权限可能不允许服务器读取文件。
  • XML 文件中可能存在错误,导致无法正确解析。

如果加载 .XML file

评论

0赞 dv2023it79 11/6/2023
在这里,你使用asimplexml_load_string。我的文件在服务器上,所以我应该使用simplexml_load_file。但是在这个罐子里,当我使用它时,它不起作用......您可以使用文件服务器而不是加载字符串来调整示例代码吗?
0赞 AztecCodes 11/6/2023
@dv2023it79 让我试试这个
0赞 dv2023it79 11/6/2023
有这方面的消息吗?你检查过吗?
0赞 AztecCodes 11/6/2023
@dv2023it79,我对我的答案进行了更新。我希望它能解决您的问题。
0赞 dv2023it79 11/6/2023
不幸的是,错误是:致命错误:未捕获错误:在 bool 上调用成员函数 getNamespaces()