繁体   English   中英

PHP XML DomDocument - 提取属性和子属性

[英]PHP XML DomDocument - Pulling attributes and child attributes

<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)

然而,当然,属性名称和值显示,减去描述。 我希望我已经解释过这个好吧......

任何援助将不胜感激!

子节点不仅是元素,还是文本节点。 所以你得到了空白文本节点。 它们没有属性,并且抛出错误。

我修改了你的源代码来显示类: 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);

输出: https//eval.in/112222

array(4) {
  ["ChannelId"]=>
  string(22) "
    Description 1.
  "
  ["resultCode"]=>
  string(27) "     
    Description 2.
  "
  ["jid"]=>
  string(22) "
    Description 3.
  "
  ["thing"]=>
  string(22) "
    Description 5.
  "
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM