2 回答
TA贡献1796条经验 获得超10个赞
问题是该元素GetVehiculesLocationResponse定义了一个新的默认命名空间,因此子元素都在该新命名空间中......
<GetVehiculesLocationResponse xmlns="http://google.fr/">
因此,首先注册新的名称空间,然后将其用作较低级别元素中的前缀......
$xml1->registerXPathNamespace("d", "http://google.fr/");
$items = $xml1->xpath("/soap:Envelope/soap:Body/d:GetVehiculesLocationResponse/d:GetVehiculesLocationResult/d:Location[d:idVH = '002']");
TA贡献1786条经验 获得超13个赞
考虑XSLT(XPath 的同级语言),它是一种专用语言,旨在转换 XML 文件,特别适合处理许多元素。事实上,您甚至可以将参数001
从 PHP 传递到 XSLT。PHP 可以使用库的xsl类运行 XSLT 1.0 脚本DOMDocument
。
XSLT
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:googl="http://google.fr/">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- DEFINE PARAM WITH DEFAULT -->
<xsl:param name="id_param">001</xsl:param>
<!-- IDENTITY TRANSFORM -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- KEEP NODES BY PARAM VALUE -->
<xsl:template match="googl:GetVehiculesLocationResult">
<xsl:copy>
<xsl:copy-of select="googl:Location[googl:idVH != $id_param]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
PHP (在循环中将参数传递给 XSLT)
// LOAD XML
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load($data->xmlFile);
// LOAD XSLT
$xsl = new DOMDocument('1.0', 'UTF-8');
$xsl->load('XSLT_Script.xsl');
// INITIALIZE TRANSFORMER
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
foreach($param as array('001', '002')) {
// SET PARAMETER VALUE
$proc->setParameter('', 'id_param', $param);
// TRANSFORM SOURCE
$xml = $proc->transformToDoc($xml);
}
// ECHO TO SCREEN
echo $xml->saveXML();
// SAVE TO FILE
file_put_contents($data->xmlFile, $xml);
输出
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<GetVehiculesLocationResponse xmlns="http://google.fr/">
<GetVehiculesLocationResult>
<Location>
<idVH>11111111</idVH>
<date>2020-03-24T21:49:46</date>
<latitude>1111111</latitude>
<longitude>11111111</longitude>
</Location>
</GetVehiculesLocationResult>
</GetVehiculesLocationResponse>
</soap:Body>
</soap:Envelope>
- 2 回答
- 0 关注
- 169 浏览
添加回答
举报