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

如何停止XML dom解析PHP中的循环,php,xml,dom,simplexml,xmldom,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>

我有这样的代码:

<?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>

路易斯
某条街
00001
芬兰
拉什
某条街
00001
芬兰
史蒂夫
另一条街
43400
瑞典
如果在xml dom解析中找到名称“Rakshith”,如何停止循环。在简单的xml解析器中,我们可以直接访问第n个元素,比如$xml->Person[0]->Name。但在XMLDOM中,据我所知,我们需要在foreach本身中进行解析。有没有这样的方法适合我的要求


如果您正在使用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)
  );
}
输出:

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

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

Xpath表达式选择
Personlist
文档元素

/ns1:Personlist

然后它的
Person
子元素:

/ns1:Personlist/ns1:Person

将该列表限制为具有值为“Rakshith”

/ns1:Personlist/ns1:Person[ns1:Name=“Rakshith”]

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


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

我认为您需要一个sax解析器来实现这一点……感谢您的快速回复@eric.itzhak。以前我使用的是简单的xml解析器()。由于本论坛的一位专家建议使用未定义的对象,我转而使用XMLDOM。现在你们建议我使用sax解析器,现在我对这些东西有点困惑,我应该选择哪一个。我是XML的新手。你能帮我一下吗?因为在我们所依赖的XML Web服务中,从一个到另一个的细节总是会丢失一些标记,这会导致未定义的对象类型并停止执行。根据您的看法,哪一个是处理此问题的最佳XML解析器?谢谢我自己也不是专家,但据我所知,你不能用你的条件停止dom解析器,这就是为什么sax解析器是用于。。。事情既是
simple\u xml\u parser
又是一个你似乎切换到的dom解析器,其中整个xml在使用之前都是在内存中构建的,而sax解析器的概念是它是基于事件的,你实际上不是在内存中构建它,而是在内存中迭代,不知道哪一个更适合你,但请阅读以下差异:
string(8) "Rakshith"
string(7) "Finland"