<tle-type name="Channel" tag="47" mt="true">
<tle-field name="ChannelId" tag="1" type="String" minOccurs="1" maxOccurs="1">
Description 1.
</tle-field>
<tle-field name="resultCode" tag="2" enum="true" type="ChannelResult" minOccurs="1" maxOccurs="1">
Description 2.
</tle-field>
<tle-field name="jid" tag="3" type="String" minOccurs="0" maxOccurs="1">
Description 3.
</tle-field>
<tle-field name="thing" tag="4" type="String" minOccurs="0" maxOccurs="1">
Description 5.
</tle-field>
</tle-type>
上面是我正在处理的XML部分。 'tle-type'下的'tag'属性是唯一标识符,然后在其子项'tle-field'中将是另一个'tag'属性。我基本上想找到一种方法来识别第一个'标签''tle-type',然后在'tle-field'中创建一个$ attribute =“value”,其描述在$ desc中。
虽然我可以使用tag =“x”来提取'tle-type'属性,但我似乎无法将子属性拉出tag ='y'。我可以打印所有属性。
foreach ($xml->getElementsByTagName('tle-type') as $tag) {
if($tag->getAttribute('tag') === '47') {
foreach ($tag->childNodes as $child ) {
foreach ($child->attributes as $t ) {
echo "<BR>".$t->nodeName." = ".$t->nodeValue;
}
}
}
}
有了上述内容,我最终得到警告:第4行的file.php中为foreach()提供的参数无效:
foreach ($child->attributes as $t)
然而,当然,属性名称和值会显示,减去描述。我希望我已经解释好了......
任何帮助都将不胜感激!
答案 0 :(得分:3)
子节点不仅是元素,还是文本节点。所以你得到了空白文本节点。它们没有属性,并且会抛出错误。
我修改了您的来源以显示课程:https://eval.in/112204
$dom = new DOMDocument();
$dom->loadXml($xml);
foreach ($dom->getElementsByTagName('tle-type') as $tag) {
if($tag->getAttribute('tag') === '47') {
foreach ($tag->childNodes as $child) {
var_dump(get_class($child));
}
}
}
所以你必须检查孩子是否是DOMElement
的一个实例。但这是一种更简单的方法。创建一个Xpath对象并使用表达式:
$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
$result = [];
foreach ($xpath->evaluate('//tle-type[@tag = "47"]/tle-field') as $field) {
$result[$field->getAttribute('name')] = $field->nodeValue;
}
var_dump($result);
array(4) {
["ChannelId"]=>
string(22) "
Description 1.
"
["resultCode"]=>
string(27) "
Description 2.
"
["jid"]=>
string(22) "
Description 3.
"
["thing"]=>
string(22) "
Description 5.
"
}