为什么我无法在php中获得XML文件的第一个子值

时间:2018-03-14 12:57:40

标签: php xml

我使用XMLHttpRequest对象从PHP响应中检索数据。

然后,我创建了一个XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person>
        <name>Ce</name>
        <gender>male</gender>
        <age>24</age>
    </person>
    <person>
        <name>Lin</name>
        <gender>female</gender>
        <age>25</age>
    </person>
</persons>

在PHP文件中,我加载XML文件并尝试回显&#34; name的标记值。&#34;

$dom = new DOMDocument("1.0");
$dom -> load("test.xml");
$persons = $dom -> getElementsByTagName("person");
foreach($persons as $person){
    echo $person -> childNodes -> item(0) -> nodeValue;
}

但是nodeValue返回的是null。但是,当我更改为item(1)时,可以显示名称标记值。为什么呢?

3 个答案:

答案 0 :(得分:0)

将代码更改为

$dom = new DOMDocument("1.0");
$dom -> load("test.xml");
$persons = $dom -> getElementsByTagName("persons");
foreach($persons as $person){
echo  $person->childNodes[1]->nodeValue;
}

答案 1 :(得分:0)

使用DOM你需要获得正确的元素来获取名称,子节点包括各种各样的东西,包括空格。您尝试使用的节点0因此而为null。所以对于DOM ......

$dom = new DOMDocument("1.0");
$dom -> load("test.xml");
$persons = $dom -> getElementsByTagName("person");
foreach($persons as $person){
   $name = $person->getElementsByTagName("name");
   echo $name->item(0)->nodeValue.PHP_EOL;
}

如果您的要求如此简单,您也可以使用SimpleXML ...

$sxml = simplexml_load_file("test.xml");
foreach ( $sxml->person as $person )    {
    echo $person->name.PHP_EOL;
}

这允许您像访问对象属性一样访问元素,并且您可以看到->person等同于访问<person>

答案 2 :(得分:0)

DOM中的任何内容都是节点,包含只有空格的文本和文本。因此person元素节点的第一个子节点是一个文本节点,它包含name元素节点之前的换行符和缩进。

这是一个在分析时删除任何空白节点的属性:

$document = new DOMDocument("1.0");
// do not preserve whitespace only text nodes
$document->preserveWhiteSpace = FALSE;
$document->load("test.xml");
$persons = $document->getElementsByTagName("person");
foreach ($persons as $person) {
    echo $person->firstChild->textContent;
}

但通常更好的方法是使用Xpath表达式。

$document = new DOMDocument("1.0");
$document->load("test.xml");
$xpath = new DOMXpath($document)
$persons = $xpath->evaluate("/persons/person");
foreach ($persons as $person) {
    echo $xpath->evaluate("string(name)", $person);
}

string(name)获取子元素节点name(位置不相关)并将其强制转换为字符串。如果此处没有name元素,则返回空字符串。