【问题标题】:PHP DOM get children excluding text nodesPHP DOM 获取不包括文本节点的子节点
【发布时间】:2020-06-21 13:06:07
【问题描述】:

如何只获取没有文本节点的子节点? 我有以下文件:

<Sys>
    <Const>
        <C1>A</C1>
        <C2>B</C2>
        <C3>C</C3>
    </Const>
</Sys>

得到“Const”的孩子我得到6个元素,

<?php
$doc = new DOMDocument();
$doc->load($file_path);

$constants = $doc->getElementsByTagName('Const')->item(0);

foreach ($constants->childNodes as $const) {
    echo $const->nodeName . ': ' . $const->nodeValue . '<br />';
}
?>

哪个打印:

#text:
C1: A
v#text:
C2: B
#text:
C3: C

如何获取唯一的 C1、C2 和 C3 节点,不包括文本节点?

【问题讨论】:

  • 你只需要 C1 的值吗?
  • xpath 或查看nodeType
  • 如果您正在处理数据 XML 文件,您可能会发现使用 SimpleXML 更容易,因为它将排除 DOM 保留的许多额外内容。
  • 感谢您的回答,我正在使用 DOM 来解决向后兼容性问题。 libxml 模块比 SimpleXml 更容易安装。如果您有不同的证据,我很乐意知道。

标签: php xml dom


【解决方案1】:

在给出的示例中,您可以简单地将标志 preserveWhiteSpace 设置为 false,这可以防止空格(新行、制表符、空格等)创建额外的文本节点...

$doc->preserveWhiteSpace = false;
$doc->load($file_path);

【讨论】:

    【解决方案2】:

    您可以使用 Xpath 表达式来获取 DOM 的特定部分。

    • 任何“常量”元素//Const
    • “Const”的子元素//Const/*

    例子:

    $xml = <<<'XML'
    <Sys>
        <Const>
            <C1>A</C1>
            <C2>B</C2>
            <C3>C</C3>
        </Const>
    </Sys>
    XML;
    
    $document = new DOMDocument();
    $document->loadXML($xml);
    $xpath = new DOMXpath($document);
    
    foreach ($xpath->evaluate('//Const/*') as $constant) {
      echo $constant->nodeName . ': ' . $constant->textContent . "\n";
    }
    

    输出:

    C1: A
    C2: B
    C3: C
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-18
      • 2017-12-27
      • 2014-07-23
      • 2011-09-18
      • 2017-09-10
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      相关资源
      最近更新 更多