【问题标题】:Cannot read the subnodes with PHP of an XML file无法使用 XML 文件的 PHP 读取子节点
【发布时间】:2021-05-31 02:24:39
【问题描述】:

我正在使用 PHP 读取 XML 文件,如下所示:
$this->dom->loadHTML('<?xml encoding="UTF-8">' . $strbody );
$xp = new \DOMXPath($this->dom);

foreach( $xp->query('//div | //ul | //ol') as $node) {
    array_push($nodes, $node);
}
// Further processing of the individual elements.
// "2 loop".
foreach( $nodes as $node) 
{
    echo "node: " . print_r($node, true) . PHP_EOL;  
}

通过 2 循环我想访问子揉捏。
从这个节点我可以输出属性:

foreach ( $node->attributes as $nodeValue )
{
    echo "attributes: ".print_r($nodeValue, true).PHP_EOL;
}

或者我也可以打印出子节点:

foreach ( $node->childNodes as $nodeValue )
{
    echo "childNodes: ".print_r($nodeValue, true).PHP_EOL;
}

但是我怎样才能访问子节点呢?
下面是 XML 文件的结构:

<startxml system="https://bspurl.de" sprache="DE">
    <inhalt bez="body" sprache="DE">
            <objekt type="xhtml">
                </div class="text">
                    sadf gfew
                </div>
                <div class="h2">Überschrift</div>
                    <div class="text">
                        <span class="bold">Weitere Infos:</span>
                    </div>
                </div class="text">
                    asf 43 rfedv34asd
                </div>
            </objekt>
        </inhalt>    
</startxml>

我需要访问 span (Weitere Infos:) 元素,如何访问?

谢谢

【问题讨论】:

    标签: php xml dom


    【解决方案1】:

    DOMXpath::evaluate()/query() 的第二个参数是 Xpath 表达式的上下文节点。所以你可以相对于当前节点寻址节点。

    DOMNode::$textContent 返回节点的文本内容,包括其后代节点。

    $xml = <<<'XML'
    <?xml version="1.0" encoding="UTF-8"?>
    <startxml system="https://bspurl.de" sprache="DE">
        <inhalt bez="body" sprache="DE">
            <objekt type="xhtml">
                <div class="text">before</div>
                <div class="h2">Überschrift</div>
                <div class="text">
                    <span class="bold">Weitere Infos:</span>
                </div>
                <div class="text">after</div>
            </objekt>
        </inhalt>    
    </startxml>
    XML;
    
    $document = new DOMDocument();
    $document->loadXML($xml);
    $xpath = new DOMxpath($document);
    
    foreach ($xpath->evaluate('//div') as $div) {
        var_dump('DIV: ', $div->textContent);
        foreach ($xpath->evaluate('.//span[@class="bold"]', $div) as $span) {
            var_dump('SPAN:', $span->textContent);
        }
    }
    

    DOMxpath::evaluate() 可以返回标量值。这允许在 Xpath 中转换值:

    foreach ($xpath->evaluate('//objekt[@type="xhtml"]') as $objekt) {
            var_dump(
                $xpath->evaluate(
                    'string(.//div[@class="h2"]/following-sibling::*//span[@class="bold"])', 
                    $objekt
                )
            );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多