主源代码树附带的PHP扩展。 SimpleXML扩展提供了一个非常简单且易于使用的工具集,用于将XML转换为可以使用普通属性选择器和数组迭代器处理的对象。对于Java“Simple”XML框架,请使用[simple-framework]标签。
我正在努力扩展当前的 SimpleXML XPath 以包含“或”条件。 这是下面的原始(工作)代码,没有任何“或”条件。 $strXpathVar = "奖学金/研究&q...
我从 XML 文件中提取数据,它打印的不仅仅是值,而我只想要使用以下代码的值: 我从 XML 文件中提取数据,它打印的不仅仅是值,而我只想要使用此代码的值: <?php $url = 'site.com'; $result = file_get_contents($url, false); if ($result === false) { /* Handle error */ } $output = $result; $xmlObject = simplexml_load_string($output);?> ////As per Paul's code suggestions. I changed `xml` to `xmlObject` <pre><?php echo print_r($xml);?></pre> 给了我这个: SimpleXMLElement Object ( [@attributes] => Array ( [returnVersion] => 2022v5.0 ) [ReturnHeader] [ReturnData] => SimpleXMLElement Object [FromForm] => SimpleXMLElement Object [DataGrp] [DataGrpPerson] => Array ( [0] => SimpleXMLElement Object ( [PersonNm] => Joan Jett [USAddress] => SimpleXMLElement Object ( [AddressLine1Txt] => 0 EAST Main STREET [CityNm] => CITY NAME [StateAbbreviationCd] => STATE NAME [ZIPCd] => ZIP NUMBER ) [TitleTxt] => POSITION TITLE ) [1] => SimpleXMLElement Object ( PersonNm] => Tom Petty [USAddress] => SimpleXMLElement Object ( [AddressLine1Txt] => 1 EAST Main STREET [CityNm] => CITY NAME [StateAbbreviationCd] => STATE NAME [ZIPCd] => ZIP NUMBER ) [TitleTxt] => POSITION TITLE ) [2] => SimpleXMLElement Object ( PersonNm] => Brandi Carlile [USAddress] => SimpleXMLElement Object ( [AddressLine1Txt] => 2 EAST Main STREET [CityNm] => CITY NAME [StateAbbreviationCd] => STATE NAME [ZIPCd] => ZIP NUMBER ) ) 这是我用来显示数据的 Html <?php foreach ($xml->ReturnData->FromForm->DataGrp]->DataGrpPerson[0]->PersonNm as $item) { echo print_r($item);}?>, <?php foreach ($xml->ReturnData->FromForm->DataGrp]->DataGrpPerson[0]->TitleTxt as $item) { echo print_r($item);}?> 这是输出(只是名称和标题) SimpleXMLElement Object ( [0] => Joan Jett ) 1, SimpleXMLElement Object ( [0] => POSTION TITLE ) 1 SimpleXMLElement Object ( [0] => S Tom Petty ) 1, SimpleXMLElement Object ( [0] => POSTION TITLE ) 1 SimpleXMLElement Object ( [0] => Brandi Carlile ) 1, SimpleXMLElement Object ( [0] => POSTION TITLE ) 我怎样才能得到这些值? 我在 Stackoverflow 上梳理了好几天,但找不到任何人描述这个问题 问题是您正在打印变量的表示,然后 print_r() 函数成功。 输出看起来像这样,因为它实际上是两部分: SimpleXMLElement Object ( [0] => Joan Jett ) 1 首先,print_r() 打印出变量本身的人类可读表示: SimpleXMLElement Object ( [0] => Joan Jett ) 然后你就回显了print_r()函数的结果。该函数返回 true,因此 php 将回显该值: 1 您需要做的是直接回显值,而不是变量的表示。例如: foreach ($xmlObject->ReturnData->FromForm->DataGrp->DataGrpPerson as $person) { echo $person->PersonNm . ', ' . $person->TitleTxt . PHP_EOL; } 会输出 Joan Jett, POSTION TITLE Tom Petty, POSTION TITLE Brandi Carlile, 如果您只想在有标题时打印逗号,则可以创建一个要打印的字段数组,然后将它们分解为逗号分隔的字符串: foreach ($xmlObject->ReturnData->FromForm->DataGrp->DataGrpPerson as $person) { $fields = []; if (!empty($person->PersonNm)) { $fields[] = $person->PersonNm; } if (!empty($person->TitleTxt)) { $fields[] = $person->TitleTxt; } echo implode(', ', $fields) . PHP_EOL; }
我正在从 xml 文件中提取数据,它打印的内容比值多。我只想要价值观。 我正在使用这个代码 我从 xml 文件中提取数据,它打印的内容比值多。我只想要价值观。 我正在使用这个代码 <?php $url = 'site.com'; $result = file_get_contents($url, false); if ($result === false) { /* Handle error */ } $output = $result; $xml = simplexml_load_string($output);?> <pre><?php echo print_r($xml);?></pre> 给我这个: SimpleXMLElement Object ( [@attributes] => Array ( [returnVersion] => 2022v5.0 ) [ReturnHeader] [ReturnData] => SimpleXMLElement Object [FromForm] => SimpleXMLElement Object [DataGrp] [DataGrpPerson] => Array ( [0] => SimpleXMLElement Object ( [PersonNm] => Joan Jett [USAddress] => SimpleXMLElement Object ( [AddressLine1Txt] => 0 EAST Main STREET [CityNm] => CITY NAME [StateAbbreviationCd] => STATE NAME [ZIPCd] => ZIP NUMBER ) [TitleTxt] => POSTION TITLE ) [1] => SimpleXMLElement Object ( PersonNm] => Tom Petty [USAddress] => SimpleXMLElement Object ( [AddressLine1Txt] => 1 EAST Main STREET [CityNm] => CITY NAME [StateAbbreviationCd] => STATE NAME [ZIPCd] => ZIP NUMBER ) [TitleTxt] => POSTION TITLE ) [2] => SimpleXMLElement Object ( PersonNm] => Brandi Carlile [USAddress] => SimpleXMLElement Object ( [AddressLine1Txt] => 2 EAST Main STREET [CityNm] => CITY NAME [StateAbbreviationCd] => STATE NAME [ZIPCd] => ZIP NUMBER ) ) 这是我用来显示数据的 Html <?php foreach ($xml->ReturnData->FromForm->DataGrp]->DataGrpPerson[0]->PersonNm as $item) { echo print_r($item);}?>, <?php foreach ($xml->ReturnData->FromForm->DataGrp]->DataGrpPerson[0]->TitleTxt as $item) { echo print_r($item);}?> 这是输出(只是名称和标题) SimpleXMLElement Object ( [0] => Joan Jett ) 1, SimpleXMLElement Object ( [0] => POSTION TITLE ) 1 SimpleXMLElement Object ( [0] => S Tom Petty ) 1, SimpleXMLElement Object ( [0] => POSTION TITLE ) 1 SimpleXMLElement Object ( [0] => Brandi Carlile ) 1, SimpleXMLElement Object ( [0] => POSTION TITLE ) 我怎样才能得到这些值? 我已经梳理了 stackoverflow 好几天了。我找不到任何人描述这个问题 问题是您正在打印变量的表示,然后 print_r() 函数成功。 输出看起来像这样,因为它实际上是两部分: SimpleXMLElement Object ( [0] => Joan Jett ) 1 首先,print_r() 打印出变量本身的人类可读表示: SimpleXMLElement Object ( [0] => Joan Jett ) 然后你就回显了print_r()函数的结果。该函数返回 true,因此 php 将回显该值: 1 您需要做的是直接回显值,而不是变量的表示。例如: foreach ($xmlObject->ReturnData->FromForm->DataGrp->DataGrpPerson as $person) { echo $person->PersonNm . ', ' . $person->TitleTxt . PHP_EOL; } 会输出 Joan Jett, POSTION TITLE Tom Petty, POSTION TITLE Brandi Carlile, 如果您只想在有标题时打印逗号,则可以创建一个要打印的字段数组,然后将它们分解为逗号分隔的字符串: foreach ($xmlObject->ReturnData->FromForm->DataGrp->DataGrpPerson as $person) { $fields = []; if (!empty($person->PersonNm)) { $fields[] = $person->PersonNm; } if (!empty($person->TitleTxt)) { $fields[] = $person->TitleTxt; } echo implode(', ', $fields) . PHP_EOL; }
我对这个完全不知所措...我编写了一个函数,它首先检查缓存目录中是否存在缓存推文的 XML 文件,然后从该文件或通过
我有这样的事情: $url = "http://ws.geonames.org/findNearbyPostalCodes?country=pl&placename="; $url .= rawurlencode($city[$i]); $xml = simplexml_load_file($url); 回显$url。” ”; $ci...
我有这个数组: SimpleXMLElement 对象 ( [id] => 数组 ( [0] => 考拉.jpg [1] => 水母.jpg ) [描述] => 数组 ( [0] => 考拉德斯克 [...
如何通过 php 从该 xml 文件中获取包含“steamID64”的列表?: http://steamcommunity.com/groups/BillKeyTrading/memberslistxml/?xml=1 这是我当前的代码: $file = simplexml_load_...
大家好,我正在使用 simplexml 从外部 xml 源提取数据。我什至有限制要显示的结果数量的值。我想我可以用一个简单的查询来分页......
使用 SimpleXMLparser php 解析具有名称空间的 xml
我正在尝试解析这样的XML: 我正在尝试解析这样的 XML: <?xml version="1.0" encoding="UTF-8"?> <gml:FeatureCollection xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:wfs="http://www.opengis.net/wfs" xmlns:p="http://example.org"> <gml:featureMember> <p:Point> <gml:pointProperty> <gml:Point srsName="epsg:4258"> <gml:pos>-3.84307585 43.46031547</gml:pos> </gml:Point> <gml:Point srsName="epsg:4258"> <gml:pos>-3.84299411 43.46018513</gml:pos> </gml:Point> <gml:Point srsName="epsg:4258"> <gml:pos>-3.84299935 43.45998723</gml:pos> </gml:Point> <!-- ... many more <gml:Point> nodes ... --> <gml:Point srsName="epsg:4258"> <gml:pos>-3.84309913 43.46054546</gml:pos> </gml:Point> <gml:Point srsName="epsg:4258"> <gml:pos>-3.84307585 43.46031547</gml:pos> </gml:Point> </gml:pointProperty> </p:Point> </gml:featureMember> </gml:FeatureCollection> 我想将每一行gml:pos保存到数据库中,但目前我很高兴在Webpace中打印它们(echo...) $output = simplexml_load_string($output); $xml = $output->getNamespaces(true); //print_r( $xml); $xml_document = $output->children($xml["p"]); foreach($xml_document->Point->children($xml["gml"]); echo $xml_point->Point[0]; echo $xml->FeatureCollection; } 在 $output 中,我有完整的 xml,在 gml:point 中有大量坐标 但是我试图使用命名空间来达到目的,但我必须做一些错误的事情,因为除了数组单词之外我无法打印任何内容(即使使用print_r...) 您不应从文档中提取命名空间 URI。命名空间 URI 是定义标记所属的 XML 语义的唯一字符串。换句话说,URI 标识名称空间,而不是别名。您的 XML 就是一个很好的示例,因为它在两个不同的命名空间中具有 Point 元素。 p:Point决心{http://example.org}Point gml:Point决心{http://www.opengis.net/gml}Point 诸如 p 和 gml 之类的命名空间前缀是别名,可以使文档更小、更具可读性。它们仅对元素及其子元素有效。它们可以在任何元素上重新定义,并且对于元素来说它们是可选的。更重要的是它们仅对文档有效。以下三个示例均解析为{http://example.org}Point。 前缀“p”:<p:Point xmlns:p="http://example.org"/> 前缀“示例”:<example:Point xmlns:example="http://example.org"/> 无前缀:<Point xmlns="http://example.org"/> 要读取 XML,您需要为命名空间定义自己的前缀,并将它们与 Xpath 一起使用,或者使用 DOM 方法的命名空间感知变体,例如 getAttributeNS()。 Xpath 显然是更优雅的解决方案。您可以使用文档中的前缀或不同的前缀。 SimpleXML 要求您在您调用的每个 SimpleXMLElement 上注册名称空间 xpath()。为了避免代码重复,我建议定义一个包含命名空间的数组和一个注册它们的函数。 // define an array with the namespaces you're using // the keys are your aliases - independent of the XML document. $xmlns = [ 'gml' => 'http://www.opengis.net/gml', 'p' => 'http://example.org' ]; // wrap the array in a function $registerNamespaces = static function(SimpleXMLElement $target) use ($xmlns) { foreach ($xmlns as $alias => $uri) { $target->registerXPathNamespace($alias, $uri); } }; $element = simplexml_load_string($content); $registerNamespaces($element); $result = []; // use your prefixes to references the namespaces in Xpath $positions = $element->xpath('//p:Point[1]//gml:pos'); foreach ($positions as $pos) { $result[] = (string)$pos; } var_dump($result); 输出:https://eval.in/159739 array(5) { [0]=> string(23) "-3.84307585 43.46031547" [1]=> string(23) "-3.84299411 43.46018513" [2]=> string(23) "-3.84299935 43.45998723" [3]=> string(23) "-3.84309913 43.46054546" [4]=> string(23) "-3.84307585 43.46031547" } 使用 XPath 会更容易,因为您的节点深深嵌套在交替的命名空间中,但由于您使用的是 SimpleXML,我将向您展示使用该框架的解决方案。 这个 $output->children($xml["p"]); 不起作用,因为根节点在 p 命名空间中没有 children。您必须在树中导航,直到处于正确的上下文中。使用 XPath,您可以使用 descendant 轴表达式获取它们,这会更简单。下面的代码适用于 SimpleXML: $pointProperty = $output ->children($xml["gml"])->featureMember ->children($xml["p"])->Point ->children($xml["gml"]); 现在您可以在 pointProperty 的 children 上循环,您将拥有 Point 节点: foreach($pointProperty->children($xml["gml"]) as $point) print_r($point); 从那时起,命名空间不会改变,因此您可以正常导航并获取 pos 元素中的数据。这是一个例子: echo '<table border="1">'."\n"; echo ' <tr><th>srsName</th><th>Longitude</th><th>Latitude</th></tr>'."\n"; foreach($pointProperty->children($xml["gml"]) as $point) { $coords = explode (' ', $point->pos); echo ' <tr><td>'.$point->attributes()['srsName'].'</td>'; echo '<td>'.$coords[0].'</td>'; echo '<td>'.$coords[1].'</td></tr>'."\n"; } echo '</table>'."\n"; 这将打印包含您的数据的表格。您可以调整它以满足您的需求: <table border="1"> <tr><th>srsName</th><th>Longitude</th><th>Latitude</th></tr> <tr><td>epsg:4258</td><td>-3.84307585</td><td>43.46031547</td></tr> <tr><td>epsg:4258</td><td>-3.84299411</td><td>43.46018513</td></tr> ... <tr><td>epsg:4258</td><td>-3.84307585</td><td>43.46031547</td></tr> </table> 这是一个有效的 PHP Fiddle,您可以在线试用。
希望有人能够解释为什么会发生这种情况。 我在代码中的其他地方使用了完全相同的语法,没有任何问题,但由于某种原因,这不起作用: $sale = $xml->addChi...
我需要重复一遍 做 { $QUERY = "/member?id=".$counter."&action=refresh"; $URL = $HTTP.$HTTPUSER.":".$HTTPPASS."@".$HTTPSERVER.":".$
我拥有的Xml数据是: 27441 1426 订单:9... 我拥有的Xml数据是: <?xml version="1.0" encoding="UTF-8"?> <var> <packid>27441</packid> <clientid>1426</clientid> <desc>PO: 9005969</desc> <planned_activation_date>0</planned_activation_date> </var> 我正在努力了解每个孩子的价值观。 $xml = new \SimpleXMLElement($bef); foreach ($xml->children() as $child) { $event[$someId][$child->getName()] = $child; } print_r($event); 这会导致 Array ( [1147037] => Array ( [packid] => SimpleXMLElement Object ( [0] => 27456 ) [clientid] => SimpleXMLElement Object ( [0] => 1474 ) [desc] => SimpleXMLElement Object ( [0] => Colocation Fiber Cross Connect (PO# 75122)_--Setup Fee ) [planned_activation_date] => SimpleXMLElement Object ( [0] => 0 ) ) ) 我需要做什么才能获得: Array ( [1147037] => Array ( [packid] => 27456 [clientid] => 1474 [desc] => Colocation Fiber Cross Connect (PO# 75122)_--Setup Fee [planned_activation_date] => 0 ) ) @u_mulder 指出的答案是使用: string($child) 订单:9...
Python:如何将 XML 文件解析为缺少子项的 DataFrame?
我正在尝试解析 SimpleXML 文件并转换为数据帧。我的 xml 中有大约 3000 个条目,并且一些条目中缺少我需要的子项属性之一。所以数据框...
获取 Facebook Sharer 的 Google 新闻 RSS XML 中每个条目链接的查询字符串中的 url 值
您好,我正在使用 simpleXML 来显示 news.google.com 提要。 显示的条目通过以下方式链接到原始文章: http://news.google.com/news/url?sa=t&fd=R&ct2=us&usg=
使用 SimpleXML 加载 XML 不会返回某些元素的属性
我已经使用加载了一个XML文件 simplexml_load_file($filePath,'SimpleXMLElement', LIBXML_NOCDATA); 对于大多数提供的 XML 来说,它工作得很好。但是,对于 XML 中的某些元素,
使用 simplexml_load_string() 按名称获取 XML 标签的节点值
这是我想要使用 DPD API 作为响应时得到的 XML 字符串: $soapResponse = ' 这是我想要使用 DPD API 作为响应时得到的 XML 字符串: $soapResponse = ' <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns2:getAuthResponse xmlns:ns2="http://dpd.com/common/service/types/LoginService/2.0" xmlns:ns3="http://dpd.com/common/service/exceptions"> <return> <delisId>user1234</delisId> <customerUid>pw1234</customerUid> <authToken>1112223334445567654333</authToken> <depot>111</depot> </return> </ns2:getAuthResponse> </soap:Body> </soap:Envelope>'; 现在我想让 authToken 来处理它。我的 PHP 代码如下: $xml = simplexml_load_string($soapResponse); if ($xml === false) { dd('Failed to parse XML', libxml_get_errors()); } $namespaces = $xml->getNamespaces(true); $body = $xml->children($namespaces['soap'])->Body; $response = $body->children($namespaces['ns2'])->getAuthResponse; $return = $response->return; $authToken = (string) $return->authToken; echo $authToken; 问题是 authToken 为空。我调试了它,一切看起来都很好,直到出现以下行: $return = $response->return; 在那里,我只能从 false 得到 var_dump() 值。 在这种情况下,您只需通过名称获取元素并提取值即可。您无需为命名空间而烦恼。 演示:https://3v4l.org/sPLTJ $soapResponse = ' <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns2:getAuthResponse xmlns:ns2="http://dpd.com/common/service/types/LoginService/2.0" xmlns:ns3="http://dpd.com/common/service/exceptions"> <return> <delisId>user1234</delisId> <customerUid>pw1234</customerUid> <authToken>1112223334445567654333</authToken> <depot>111</depot> </return> </ns2:getAuthResponse> </soap:Body> </soap:Envelope>'; $xml = new DOMDocument(); $xml->loadXML($soapResponse); $token = $xml->getElementsByTagName('authToken')->item(0)->nodeValue; echo $token; 并且会输出 1112223334445567654333 如果您想使用 simplexml,您可以使用 xpath 来选择元素。 $xml = simplexml_load_string($soapResponse); echo $xml->xpath('//authToken')[0];
PHP simplexml_load_string 无法获取元素
这是我想要使用 DPD API 作为响应时得到的 XML 字符串 $soapResponse = ' 这是我想要使用 DPD API 作为响应时得到的 XML 字符串 $soapResponse = ' <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns2:getAuthResponse xmlns:ns2="http://dpd.com/common/service/types/LoginService/2.0" xmlns:ns3="http://dpd.com/common/service/exceptions"> <return> <delisId>user1234</delisId> <customerUid>pw1234</customerUid> <authToken>1112223334445567654333</authToken> <depot>111</depot> </return> </ns2:getAuthResponse> </soap:Body> </soap:Envelope>'; 现在我想让 authToken 来使用它。我的 PHP 代码如下 $xml = simplexml_load_string($soapResponse); if ($xml === false) { dd('Failed to parse XML', libxml_get_errors()); } $namespaces = $xml->getNamespaces(true); $body = $xml->children($namespaces['soap'])->Body; $response = $body->children($namespaces['ns2'])->getAuthResponse; $return = $response->return; $authToken = (string) $return->authToken; echo $authToken; 问题是 authToken 为空。我调试了它,一切看起来都很好,直到行 $return = $response->return;在那里我只得到一个错误的 varDump。 也许有人有解决问题的想法。 非常感谢! 在这种情况下,您只需通过名称获取元素并提取值即可。您无需为命名空间而烦恼。 演示:https://3v4l.org/3A0Jf $soapResponse = ' <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns2:getAuthResponse xmlns:ns2="http://dpd.com/common/service/types/LoginService/2.0" xmlns:ns3="http://dpd.com/common/service/exceptions"> <return> <delisId>user1234</delisId> <customerUid>pw1234</customerUid> <authToken>1112223334445567654333</authToken> <depot>111</depot> </return> </ns2:getAuthResponse> </soap:Body> </soap:Envelope>'; $xml = new DOMDocument(); $xml->loadXML($soapResponse); $token = $xml->getElementsByTagName('authToken')->item(0)->nodeValue; echo $token; 并且会输出 1112223334445567654333
在页面上我可以从 XML 文件加载内容。 然后有一个表单,根据与 $_GET['cat'] 值匹配的类别名称来显示此 XML 文件中的条目。 然后表格允许...
PHP - SimpleXMLElement 未使用名称空间正确解析
这是由API返回的: 这是由 API 返回的: <?xml version='1.0' encoding='utf-8'?> <entry xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xml:base="https://exmple.com/odata/"> <id>https://example.com/odata/PicklistOption(989L)</id> <title type="text" /> <updated>2015-09-03T11:56:51Z</updated> <author> <name /> </author> <link rel="edit" title="PicklistOption" href="PicklistOption(989L)" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/childPicklistOptions" type="application/atom+xml;type=feed" title="childPicklistOptions" href="PicklistOption(989L)/childPicklistOptions" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/parentPicklistOption" type="application/atom+xml;type=entry" title="parentPicklistOption" href="PicklistOption(989L)/parentPicklistOption" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/picklistLabels" type="application/atom+xml;type=feed" title="picklistLabels" href="PicklistOption(989L)/picklistLabels" /> <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/picklist" type="application/atom+xml;type=entry" title="picklist" href="PicklistOption(989L)/picklist" /> <category term="SFOData.PicklistOption" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /> <content type="application/xml"> <m:properties> <d:id m:type="Edm.Int64">989</d:id> <d:status>ACTIVE</d:status> <d:sortOrder m:type="Edm.Int32">229</d:sortOrder> <d:minValue m:type="Edm.Double">-1</d:minValue> <d:externalCode>PL</d:externalCode> <d:optionValue m:type="Edm.Double">-1</d:optionValue> <d:maxValue m:type="Edm.Double">-1</d:maxValue> </m:properties> </content> </entry> 现在正在努力获得<d:id> $xml = new SimpleXMLElement($xmlstr); $namespaces = $xml->getNameSpaces(true); $xml->registerXPathNamespace('m', $namespaces['m']); $xml->registerXPathNamespace('d', $namespaces['d']); $id = $xml->xpath('/entry/content/m:properties/d:id'); var_dump($id); 但我明白了array(0)。 不要从文档中获取命名空间。在您的应用程序中定义它们。命名空间是 xmlns/xmlns:* 属性的值。 xmlns 属性是默认命名空间。所以标签 entry 实际上是 {http://www.w3.org/2005/Atom}:entry。 命名空间必须是唯一的。为了避免冲突,大多数人使用 URL。 (其他人不太可能使用您的域来定义他们的命名空间。)这样做的缺点是命名空间是带有特殊字符的大字符串。这是通过使用命名空间前缀作为别名来解决的。 Xpath 没有默认的命名空间。您需要为您喜欢使用的每个命名空间注册一个前缀。 Xpath 引擎会将前缀解析为实际名称空间,并将其与节点解析的名称空间进行比较。 $xml = new SimpleXMLElement($xmlstr); $namespaces = [ 'a' => 'http://www.w3.org/2005/Atom', 'm' => 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata', 'd' => 'http://schemas.microsoft.com/ado/2007/08/dataservices', 'o' => 'https://exmple.com/odata/' ]; foreach ($namespaces as $prefix => $namespace) { $xml->registerXPathNamespace($prefix, $namespace); } $id = $xml->xpath('/a:entry/a:content/m:properties/d:id'); var_dump($id); 输出: array(1) { [0]=> object(SimpleXMLElement)#2 (0) { } } 您必须再次在每个 SimpleXMLElement 上注册 Xpath 命名空间。 这在 DOM 中更方便。 DOMXpath::evaluate() 执行 Xpath 表达式,并可以返回节点列表或标量,具体取决于表达式。 $document = new DOMDocument($xmlstr); $document->loadXml($xmlstr); $xpath = new DOMXpath($document); $namespaces = [ 'a' => 'http://www.w3.org/2005/Atom', 'm' => 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata', 'd' => 'http://schemas.microsoft.com/ado/2007/08/dataservices', 'o' => 'https://exmple.com/odata/' ]; foreach ($namespaces as $prefix => $namespace) { $xpath->registerNamespace($prefix, $namespace); } $id = $xpath->evaluate('string(/a:entry/a:content/m:properties/d:id)'); var_dump($id); 输出: string(3) "989" 这是如何通过节点元素方法完成的,例如 $xml->内容->属性->id ?
我从 Soap 请求中获取响应,并将其传递到新的 SimpleXML 构造中。 $response = $this->client->$method(array("Request" => $this->params)); $response_string = $t...