PHP SimpleXML-xpath不起作用,但在联机生成器中起作用
我有一个包含以下示例内容的大型xml文件:PHP SimpleXML-xpath不起作用,但在联机生成器中起作用,php,xml,xpath,simplexml,Php,Xml,Xpath,Simplexml,我有一个包含以下示例内容的大型xml文件: <transferData version="1.0"> <item id="1885880" itemType="kivihomepagetransfer"> <property name="country_id"> <value>4402</value> </property> <property name="rc_maintenance_other"></p
<transferData version="1.0">
<item id="1885880" itemType="kivihomepagetransfer">
<property name="country_id">
<value>4402</value>
</property>
<property name="rc_maintenance_other"></property>
<property name="claim_right_shareholder"></property>
<property name="charges_other"></property>
<property name="investment_flag"></property>
<property name="rc_repair_need"></property>
<property name="realtycompany">
<value>Asunto Oy Aulangtie 20</value>
</property>
在联机生成器中,这是可行的,但与原始xml不兼容。我只是接收SimpleXMLElement对象为空。ItemId是在foreach中生成的,但它是正确的
为什么在小示例中可以这样做,但在大文件中却找不到任何东西
我尝试了其他几种版本:
$path = '//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value';
$path = '//item[@id="1885880"]/property[@name="realtycompany"]/value/text()';
$path = '/item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value/text()';
$path = '/transferData[@version="1.0"]/item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value/text()';
等等。。。没有人找到它编辑:我解决了问题。您的XPath正在工作,但是var\u dump/print\r没有向您显示任何有用的内容。请尝试以下操作:
$path = '//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value/text()';
$company = $xml->xpath($path)[0];
print_r((string)$company);
早期反应 我没有太多使用XPath,但问题似乎在于“值”位。如果未使用
值
,XPath将返回正确的内容
这对我很有用:(当然,在访问数组索引之前,我没有添加任何健全性检查)
xpath($path)[0]->值;
印刷公司;
如果您只想访问元素的值,那么使用
您正在使用SimpleXML扩展及其SimpleXMLElement::xpath()
方法专门运行xpath查询
但是,SimpleXMLElement xpath查询无法返回文本节点(text()
)。在您的例子中,即使您在xpath查询的末尾编写text()
,它也会返回text父元素节点
由于这是SimpleXML,您只需将其转换为字符串/在字符串上下文中使用它:
list($company) = $xml->xpath($path);
# echo is string context and output is: "Asunto Oy Aulangtie 20"
echo "Value: ", $company, "\n";
如果要直接从文档中检索字符串形式的文本值,可以将其导入DOMPATH并计算:
$path = 'string(//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value)';
$xpath = new DOMXPath(dom_import_simplexml($xml)->ownerDocument);
var_dump($xpath->evaluate($path)); # string(22) "Asunto Oy Aulangtie 20"
正如*var_dump*显示的那样,您从evaluate调用中获得了一个字符串,因为xpath查询查询了一个字符串(在末尾使用
text()
您将获得一个DOMTEXL节点,这是Simplexml无法表示的)。如果删除test()
有效,谢谢。是的,我已经在没有text()的情况下尝试过了,但还是一样,对象是空的。我已经在下面编辑了我的答案。您的XPath正在工作,但var\u dump/print\r没有意义地显示其内容。不要在SimpleXmlElement上使用print\r
,请使用$element->asXML('php://output');代码>,它显示了它返回的内容。我不喜欢它,他加载的是XML而不是HTML,使用HTML解析器可能会导致奇怪的错误bugs@EaterOfCorpses他可能会喜欢。我将其用于XML和HTML,文档类型实际上并不重要。它的使用比PHP的XML解析器简单得多。但我的观点是,他可能会遇到奇怪的错误或意外的行为,比如元素,他无法生成类似的代码:D :(
这在HTML中会失败,因为如果一个li接着一个li,它就必须结束另一个li,你怎么看
?HTML中的异常太多了!谢谢!它很有效。你能解释一下为什么在$company=$xml->xpath($path)[0]中使用[0]
?这对我来说太新了,我必须用这个xml构建一个大的cataloque,所以需要很多信息!因为您是按@name搜索的,所以可能会有多个结果。因此,返回一个数组。在您的情况下,是一个包含一个元素的数组。请注意,这段代码在PHP5.3
及更低版本中会失败,请改用它e$companys=$xml->xpath($path);$company=(字符串)$companys[0]->value;
include('simple_html_dom.php');
$xml = file_get_html('file.xml');
$value = $html->find('property[name=realtycompany]');
echo $value->plaintext;
list($company) = $xml->xpath($path);
# echo is string context and output is: "Asunto Oy Aulangtie 20"
echo "Value: ", $company, "\n";
$path = 'string(//item[@id="'.$itemId.'"]/property[@name="realtycompany"]/value)';
$xpath = new DOMXPath(dom_import_simplexml($xml)->ownerDocument);
var_dump($xpath->evaluate($path)); # string(22) "Asunto Oy Aulangtie 20"