通过变量引用 SimpleXML 节点名称

Reference SimpleXML node name via variable

提问人:Wickcheed 提问时间:7/12/2023 最后编辑:user3783243Wickcheed 更新时间:7/12/2023 访问量:38

问:

需要解析一个大型 XML 文档并将值添加到 SQL 数据库中。我想将所有键/值对存储在 sql 数据库中以简化我的 PHP 代码。并非所有节点都存在于所有 XML 记录中,因此需要遍历数据库值,即 classification->pn,然后查看节点是否存在,然后将值添加到 SQL 插入中。无法让它工作:

因此,而不是:

foreach($xmldata->children() as $node) {  
  if(isset($node->classification->pn)) {
     ...
  }
}

我想做:

foreach($xmldata->children() as $node) {  
  if(isset($node->$sqlrow['childnodename'])) {
     ...
  }
}

其中存储在我的 sql 表中。$sqlrow['childnodename'] = "classification->pn"

尝试将其视为动态变量,使用 等,但似乎没有任何效果。$$childnodename

PHP 简单 XML

评论

0赞 Bademeister 7/12/2023
您可以使用 XPath 解决此问题:php.net/manual/en/simplexmlelement.xpath.php
0赞 hakre 7/12/2023
欢迎使用 Stack Overflow (SO)。您需要对字符串进行评估,而不应考虑这一点。但是,为什么不将其存储为 xpath 表达式,正如@Bademeister还建议的那样: .您可以使用 SimpleXMLElement 轻松获得这样的表达式(并对结果进行 foreach)。对于您的问题,为什么这不起作用,我添加了一个答案。如果您想要更具体的答案,请考虑创建一个最小的可重现示例classification/pn

答:

-1赞 hakre 7/12/2023 #1

你想做什么,你不能用PHP写成表达式:

foreach($xmldata->children() as $node) {  
  if(isset($node->$sqlrow['childnodename'])) {
     ...
  }
}

where(存储在 mysql 表中)。$sqlrow['childnodename'] = "classification->pn"

你需要写的是:

$parts = explode('->', $sqlrow['childnodename']);
foreach($xmldata->children() as $node) {
  $cursor = $node;
  foreach($parts as $part) {
    if (!$cursor->$part) {
        continue 2; # skip to next ->children() $node
    }
    $cursor = $cursor->$part;
  }
  // $cursor is here the descendant (children, grandchildren, etc.)  you're looking for
}

(仅供参考)

这是因为 “” 中的 “” 被视为 SimpleXMLElement 中 XML elment-name 的一部分,这是无效的,因为 XML 元素名称永远不允许使用该字符。->classification->pn>

您需要更详细地处理遍历,否则 SimpleXMLElement 只能拒绝您的请求,因为它不是 XML 元素名称。

请参阅 XML 元素名称中允许的符号