【问题标题】:PHP SimpleXML get document nodePHP SimpleXML 获取文档节点
【发布时间】:2015-10-23 11:55:21
【问题描述】:

我需要从 xml 文档的最外层节点(文档本身)中提取信息。使用下面的xml:

<?xml version="1.0" encoding="UTF-8" ?>
<revue date="2015" issue="12345">
  <innernode>Oi</innernode>
</revue>

我想提取201512345。如果我尝试使用 foreach 循环读取节点 revue,我将失败

foreach ($xml->revue as $revueIn) {
    foreach ($revueIn->attributes() as $z => $y) { 

为了查看我是否有错别字或其他内容,我将innernoderevue 倒置了

<?xml version="1.0" encoding="UTF-8" ?>
<innernode>
  <revue date="2015" issue="12345">Oi</revue>
</innernode>

以上代码有效(找到revue 节点并正确读取其属性)

因此,在我看来,SimpleXML 对最外层节点的处理/感知方式有所不同。

有谁知道如何访问最外层的节点?提前 4 点您的时间。

【问题讨论】:

  • 试试foreach ($xml-&gt;attributes() as $z =&gt; $y)
  • @MartinHonnen 提供作为答案,因为它是正确的并且将被授予。 SimpleXML 不将文档作为节点访问(它是否将其视为父节点?)。属性不是节点属性,而是文档属性,必须直接访问,有attributes()getName()
  • SimpleXML 在迭代中看不到根元素。它应该被链接到 SimpleXML 对象的变量引用。所以 $xml 节点名称将是 'revue'。
  • @splash58 准确地说,它将通过getName() 访问。我在写问题的过程中找到了解决方案,但我认为无论如何我都应该问,因为肯定有人会遇到同样的问题。
  • @tonygil 我的意思就是节点名称:)

标签: php xml simplexml


【解决方案1】:

revue 不是文档节点而是元素节点。实际上,它是文档元素。

如果您将 XML 加载到 SimpleXMLElement 中,它将返回文档元素。您可以使用数组语法来访问属性。

$element = new SimpleXMLElement($xml);
var_dump((string)$element['date']);

输出:

string(4) "2015"

属性以SimpleXMLElement 形式返回。您可能需要投射它。

使用SimpleXMLElement::attributes(),您可以循环访问所有属性。

$element = new SimpleXMLElement($xml);
foreach ($element->attributes() as $name => $value) {
  var_dump($name, (string)$value);
}

输出:

string(4) "date"
string(4) "2015"
string(5) "issue"
string(5) "12345"

【讨论】:

    【解决方案2】:

    据我了解,根元素只是您的 xml 变量,因此要访问其属性,您只需使用 foreach ($xml-&gt;attributes() as $z =&gt; $y)

    【讨论】:

    • 没错!感谢 4 您的时间,我希望这对其他人有所帮助。
    猜你喜欢
    • 2011-02-18
    • 2011-08-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多