我的代码是这样的:
<?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本身。有没有这样的方式符合我的要求。
提前致谢
答案 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)
);
}
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()
函数将结果列表转换为字符串值。