温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - PHP get nodes value with nested nodes XML
php xml xpath

其他 - PHP使用嵌套节点XML获取节点值

发布于 2020-03-27 12:07:12

我有一个xml文件:

<Epo>
<Doc upd="add">
<Fld name="IC"><Prg><Sen>A01B1/00 <Cmt>(1585, 779)</Cmt></Sen></Prg></Fld>
<Fld name="CC"><Prg><Sen>A01B1/00 <Cmt>(420, 54%)</Cmt>;</Sen><Sen>B25G1/102 <Cmt>(60, 8%)</Cmt>;</Sen><Sen>A01B1/02 <Cmt>(47, 6%)</Cmt></Sen></Prg></Fld></Doc>
<Doc upd="add">
<Fld name="IC"><Prg><Sen>A01B1/02 <Cmt>(3847, 1718)</Cmt></Sen></Prg></Fld>
<Fld name="CC"><Prg><Sen>A01B1/02 <Cmt>(708, 41%)</Cmt>;</Sen><Sen>A01B1/022 <Cmt>(347, 20%)</Cmt>;</Sen><Sen>A01B1/028 <Cmt>(224, 13%)</Cmt></Sen></Prg></Fld></Doc>
</Epo>

我想获取节点值,例如:A01B1 / 00(1585,779)-A01B1 / 00(420,54%); B25G1 / 102(60,8%); A01B1 / 02(47,6%)然后将其格式化为表格的列。我怎样才能做到这一点?我的代码:

<?php
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = false;
    $doc->load('test.xml'); //IPCCPC-epoxif-201905
    $xpath = new DOMXPath($doc);
    $titles = $xpath->query('//Doc/Fld'); 
        foreach ($titles as $title){
            echo $title->nodeValue ."<hr>";
            }
?>

我无法分离evrey节点。请帮我。

查看更多

查看更多

提问者
Hàm Louis
被浏览
109
Nigel Ren 2019-07-04 13:46

我想将其拆分以获取所有不同级别的内容,但是我认为主要问题是获取当前节点文本而没有子元素文本内容。使用DOMDocument,与DOMDocument nodeValue相同textContent(从手册开始)...

textContent此节点及其后代的文本内容。

仅在访问相对简单的层次结构时,使用DOMDocument并不是最容易使用的方法,并且要求您不断进行调用(在这种情况下)getElementsByTagName()以获取所包含的元素,以下来源显示了如何使用来获取文档的每个部分这种方法

foreach ( $doc->getElementsByTagName("Doc") as $item )    {
    echo "upd=".$item->getAttribute("upd").PHP_EOL;
    foreach ( $item->getElementsByTagName("Fld") as $fld )  {
        echo "name=".$fld->getAttribute("name").PHP_EOL;
        foreach ( $fld->getElementsByTagName("Sen") as $sen )  {
            echo trim($sen->firstChild->nodeValue) ." cmt = ".
                $sen->getElementsByTagName("Cmt")[0]->firstChild->nodeValue.PHP_EOL;
        }
    }
} 

但是,使用SimpleXML API可以提供更简单的解决方案。层次结构的每个级别都使用对象表示法->Doc进行访问,因此可用于从根节点访问Doc元素,而foreach()循环则可以解决该问题。您还可以看到仅使用元素名称($sen->Cmt)只会给您该节点的文本内容,而不是后代的内容(尽管您必须将其转换为字符串才能从对象中获取值)...

$doc = simplexml_load_file("test.xml");

foreach ( $doc->Doc as $docElemnt )    {
    echo "upd=".(string)$docElemnt['upd'].PHP_EOL;
    foreach ( $docElemnt->Fld as $fld )    {
        echo "name=".(string)$fld['name'].PHP_EOL;
        foreach ( $fld->Prg->Sen as $sen )    {
            echo trim((string)$sen)."=".trim((string)$sen->Cmt).PHP_EOL;
        }
    }
}