gpt4 book ai didi

php - 基于属性值定位元素的XPath?

转载 作者:数据小太阳 更新时间:2023-10-29 03:01:33 24 4
gpt4 key购买 nike

我正在尝试搜索我创建的 XML 文档,但我似乎无法让它正常工作。这是我的 XML 文档...

<?xml version="1.0" encoding="UTF-8"?>
<states>
<repstate location="AL">
<compName>Test Company</compName>
<name>Chris Brown</name>
<address>123 Main St</address>
<city>Anytown</city>
<state>CT</state>
<phone>203-123-4567</phone>
<fax>203-456-7890</fax>
<email>info@email.com</email>
<website>www.testing.com</website>
<serviceArea>All of Alabama</serviceArea>
</repstate>
<repstate location="AK">
<compName>Test Company</compName>
<name>Chris Brown</name>
<address>123 Main St</address>
<city>Anytown</city>
<state>CT</state>
<phone>203-123-4567</phone>
<fax>203-456-7890</fax>
<email>info@email.com</email>
<website>www.testing.com</website>
<serviceArea>All of Alabama</serviceArea>
</repstate>
</states>

这是我要开始工作的代码片段...

        <?php 
$xml = simplexml_load_file('../../usa.xml');
$found = $xml->xpath("//@location='AK'");
echo $found->state;
?>

它似乎没有正常工作。

我正在尝试加载该节点中的信息。所以所有的公司名称、姓名、地址、城市、州、电话、传真、电子邮件、网站和服务区域。我认为让“状态”工作很容易,但似乎没有任何输出。我做错了什么?

最佳答案

正如 Micheal Kayhis answer 中概述的那样,xpath 表达式是有效的。他不知道的是,对于 SimpleXML,这不会导致空结果。

因此,当您尝试从空数组中读取字段时,您会看到一个 fatal error 。您的代码与此类似:

$found = array();
echo $found->state;

它回显一个空字符串(由表达式给出的 NULL 值创建)和一个通知:

Notice: Trying to get property of non-object in ...

如果您还没有看到此通知,请务必在您的开发系统中启用错误消息,请参阅 How to get useful error messages in PHP?

如您所见,它工作正常,只是没有提供您所期望的。为了让您自己以更有成效的方式继续这样做,如果您能分享您真正期望的内容,那就太好了。

或者换句话说:正如其他人也回答的那样,您需要决定要查找的内容。

从输出代码:

echo $found->state;

我会说您正在寻找以下 XML 元素:

...
<repstate location="AK">
<compName>Test Company</compName>
<name>Chris Brown</name>
<address>123 Main St</address>
<city>Anytown</city>
<state>CT</state>
...

SimpleXML Xpath 的工作原理如下:

  1. 只能查询节点列表
  2. 唯一支持的节点是元素和属性
  3. 列表总是数组类型
  4. 数组总是从零开始
  5. 数组中的每个条目 - 如果数组不为空 - 都是 SimpleXMLElement
  6. 类型

因此,在您的情况下,如果我对您希望获得的要查询的元素的假设是正确的,那么您希望返回单个元素节点的状态子元素的节点值。相应的 PHP 代码将是:

$list = $xml->xpath("//repstate[@location = 'AK']");
list($repstate) = $list + array(null);
$state = $repstate ? $repstate->state : '- no such location -';

echo $state;

您的 XML 的输出将是:

CT

或者更短:

$list = $xml->xpath("//repstate[@location = 'AK']/state");
list($state) = $list + array('- no such location -');

echo $state;

我希望这个更广泛的解释对您有所帮助。您的原始表达式不起作用的原因是它已经违反了第一点:

  1. 只能查询节点列表

因为您的 xpath 查询表示一个 bool 表达式而不是一个节点列表。此外,SimpleXMLElement xpath 中的此类列表需要您具有元素或属性,并且不是 bool 表达式。

关于php - 基于属性值定位元素的XPath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32658957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com