如何使用子节点区分这两个xml标签

时间:2016-04-26 10:00:13

标签: php xml

我的样本xml中有两个标签,如下所示,

 <EmailAddresses>2</EmailAddresses>

 <EmailAddresses>
        <string>Allen.Patterson01@fantasyisland.com</string>
         <string>Allen.Patterson12@fantasyisland.com</string>
 </EmailAddresses>

如何基于子节点区分这两个xml标签,这意味着如何检查第一个标签没有子节点而另一个标签使用DOM php

3 个答案:

答案 0 :(得分:0)

希望它能满足您的要求。只需复制,粘贴并运行即可。并根据需要更改/添加逻辑。

select * from db.tab1
where PROCESS_DT <= (select max(PROCESS_DT) - interval '72' month from db.tab1

答案 1 :(得分:0)

您可以使用set(['position = position + 1']);

->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子节点,因此在您的XML <EmailAddresses>中始终返回->haschildNodes()

由于您的奇怪的XML结构概念,您有这个问题。 如果您没有特别的理由维护此XML语法,我建议您只使用一个标记:

True

答案 2 :(得分:0)

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(*)])

获取string个元素节点的EmailAddresses个子节点。

  • 选择任何EmailAddresses元素节点:
    //EmailAddresses
  • 获取他们的string子节点:
    //EmailAddresses/string

在您的示例中,第一个EmailAddresses似乎是重复信息并以奇怪的方式存储。 Xpath也可以计算节点数。表达式count(//EmailAddresses/string)将返回节点数。