提问人:dv2023it79 提问时间:11/6/2023 最后编辑:dv2023it79 更新时间:11/6/2023 访问量:112
使用 PHP 解析 xml 子项和命名空间
Parse xml child and namespace with PHP
问:
我需要从以下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 的简单调用...可能?
答:
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 字符串问题
应采取的措施:
- 加载 XML 文件:用于将 XML 字符串加载到对象中。
simplexml_load_string
SimpleXML
- 注册命名空间:您需要将此命名空间注册到对象,才能正确查询该命名空间中的元素。
SimpleXML
- 使用 XPath 进行查询:用于查询元素。
XPath
exp: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 数据。下面是修改代码以从文件中检索内容的方法。XML
simplexml_load_file
simplexml_load_string
XML
调整后的代码:
<?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.xml
XML 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()
评论