我使用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)
时,可以显示名称标记值。为什么呢?
答案 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
元素,则返回空字符串。