如何使用子节点区分这两个 XML 标记


how to differentiate these two xml tags with childnodes

>我在我的示例 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) 将返回节点数。