>我在我的示例 xml 中有两个标签,如下所示,
<EmailAddresses>2</EmailAddresses>
<EmailAddresses>
<string>Allen.Patterson01@fantasyisland.com</string>
<string>Allen.Patterson12@fantasyisland.com</string>
</EmailAddresses>
如何根据子节点区分这两个XML标签,这意味着如何使用DOM php检查第一个标签没有子节点,另一个标签有子节点
希望它能满足您的要求。只需复制,粘贴并运行它。并根据需要更改/添加逻辑。
<?php
$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<email>
<EmailAddresses>2</EmailAddresses>
<EmailAddresses>
<string>Allen.Patterson01@fantasyisland.com</string>
<string>Allen.Patterson12@fantasyisland.com</string>
</EmailAddresses>
</email>
XML;
$email = new SimpleXMLElement($xmlstr);
foreach ($email as $key => $value) {
if(count($value)>1) {
var_dump($value);
//write your logic to process email strings
} else {
var_dump($value);
// count of emails
}
}
?>
您可以使用
->getElementsByTagName( 'string' )
:
foreach( $dom->getElementsByTagName( 'EmailAddresses' ) as $node )
{
if( $node->getElementsByTagName( 'string' )->length )
{
// Code for <EmailAddresses><string/></EmailAddresses>
}
else
{
// Code for <EmailAddresses>2</EmailAddresses>
}
}
2
被视为<EmailAddresses>
子节点,因此在 XML 中->haschildNodes()
始终返回 True
。
由于您奇怪的XML结构概念,您遇到了此问题。如果您没有特别的理由来维护此 XML 语法,我建议您只使用一个标记:
<EmailAddresses count="2">
<string>Allen.Patterson01@fantasyisland.com</string>
<string>Allen.Patterson12@fantasyisland.com</string>
</EmailAddresses>
Xpath允许你这样做。
$xml = <<<'XML'
<xml>
<EmailAddresses>2</EmailAddresses>
<EmailAddresses>
<string>Allen.Patterson01@fantasyisland.com</string>
<string>Allen.Patterson12@fantasyisland.com</string>
</EmailAddresses>
</xml>
XML;
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
var_dump(
$xpath->evaluate('number(//EmailAddresses[not(*)])')
);
foreach ($xpath->evaluate('//EmailAddresses/string') as $address) {
var_dump($address->textContent);
}
输出:
float(2)
string(35) "Allen.Patterson01@fantasyisland.com"
string(35) "Allen.Patterson12@fantasyisland.com"
表达式
获取第一个EmailAddresses
节点,没有任何元素节点子级作为数字。
- 选择任何
EmailAddresses
元素节点:
//EmailAddresses
- 不包含另一个元素节点作为子节点:
//EmailAddresses[not(*)]
- 将获取的第一个
EmailAddresses
节点转换为一个数字:
number(//EmailAddresses[not(*)])
获取EmailAddresses
元素节点的string
子节点。
- 选择任何
EmailAddresses
元素节点:
//EmailAddresses
- 获取其
string
子节点:
//EmailAddresses/string
在您的示例中,第一个EmailAddresses
似乎是重复的信息,并以奇怪的方式存储。Xpath也可以计算节点数。表达式 count(//EmailAddresses/string)
将返回节点数。