如何在XML dom解析PHP中停止循环

时间:2014-03-04 10:32:58

标签: php xml dom simplexml xmldom

我的代码是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<Personlist xmlns="http://example.org">
    <Person>
        <Name>Louis</Name>
        <Address>
            <StreetAddress>Somestreet</StreetAddress>
            <PostalCode>00001</PostalCode>
            <CountryName>Finland</CountryName>
        </Address>
    </Person>
    <Person>
        <Name>Rakshith</Name>
        <Address>
            <StreetAddress>Somestreet</StreetAddress>
            <PostalCode>00001</PostalCode>
            <CountryName>Finland</CountryName>
        </Address>
    </Person>
    <Person>
        <Name>Steve</Name>
        <Address>
            <StreetAddress>Someotherstreet</StreetAddress>
            <PostalCode>43400</PostalCode>
            <CountryName>Sweden</CountryName>
        </Address>
     </Person>
 </Personlist>

如果在xml dom解析中找到名称'Rakshith',如何停止循环。在简单的xml解析器中,我们可以直接访问第n个元素,如$ xml-&gt; Person [0] - &gt; Name。但是在XML dom中,到目前为止我们需要解析foreach本身。有没有这样的方式符合我的要求。

提前致谢

1 个答案:

答案 0 :(得分:0)

如果您正在使用DOM。您可以使用Xpath仅选择要迭代的节点:

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
$xpath->registerNamespace('ns1', 'http://example.org');

$persons = $xpath->evaluate('/ns1:Personlist/ns1:Person[ns1:Name = "Rakshith"]');
foreach ($persons as $person) {
  var_dump(
    $xpath->evaluate('string(ns1:Name)', $person),
    $xpath->evaluate('string(ns1:Address/ns1:CountryName)', $person)
  );
}

输出:https://eval.in/110336

string(8) "Rakshith"
string(7) "Finland"

Xpath非常强大。您正在使用带条件的表达式来描述节点列表(也可以是具有单个节点或空列表的列表)。如果您执行隐含标量值的操作,则使用列表中的第一个节点。

我举例说明,您定义了一个默认的XML命名空间。这里没有xpath中的默认XML命名空间,您注册自己的前缀并使用它。该示例使用“ns1”。

Xpath表达式选择Personlist文档元素

/ns1:Personlist

然后是其Person子元素:

/ns1:Personlist/ns1:Person

将该列表限制为具有值为Name

的子级"Rakshith"的节点

/ns1:Personlist/ns1:Person[ns1:Name = "Rakshith"]

这将始终返回一个列表(如果没有找到任何内容,则返回一个空列表),这样就可以迭代该列表而无需进一步验证。

循环表达式内部与上下文一起使用,作为要评估的第二个参数提供。 string()函数将结果列表转换为字符串值。