XML 解析使用但元素名称是动态的

2024-02-15

Simple XMLElement Object
(    
         [IpStatus] => 1    
         [ti_pid_20642] => SimpleXmlElement Object    
               (

我有一个上面格式的 SimpleXMLElment,这个 XML 是在运行时生成的,它的节点值如下ti_pid_20642部分是动态的,例如ti_pid_3232, ti-pid_2323, ti_pid_anyumber.

我的问题是如何使用 PHP 获取这些节点值及其子节点?


获取 XML 中使用的所有节点名称string通过 SimpleXML,您可以使用SimpleXMLIterator:

$tagnames = array_keys(iterator_to_array(
    new RecursiveIteratorIterator(
        new SimpleXMLIterator($string)
        , RecursiveIteratorIterator::SELF_FIRST
    )
));

print_r($tagnames);

这可以给你示范(你没有在你的问题中给出任何XML,Demo http://codepad.org/QWhqD3sh):

Array
(
    [0] => IpStatus
    [1] => ti_pid_20642
    [2] => dependend
    [3] => ti-pid_2323
    [4] => ti_pid_anyumber
    [5] => more
)

如果您在提供包含有效 XML 的字符串时遇到问题,请使用现有的 SimpleXMLelement 并用它创建一个 XML 字符串 http://php.net/simplexmlelement.asxml:

$string = $simpleXML->asXML();

但是,如果您想从 SimpleXML 对象获取所有标记名,但不想将其转换为字符串,则可以为以下内容创建递归迭代器:SimpleXMLElement还有:

class SimpleXMLElementIterator extends IteratorIterator implements RecursiveIterator
{
    private $element;

    public function __construct(SimpleXMLElement $element) {
        parent::__construct($element);
    }

    public function hasChildren() {
        return (bool)$this->current()->children();
    }

    public function getChildren() {
        return new self($this->current()->children());
    }
}

它的用法类似(Demo http://codepad.org/po8qVodV):

$it      = new RecursiveIteratorIterator(
    new SimpleXMLElementIterator($xml), RecursiveIteratorIterator::SELF_FIRST
);
$tagnames = array_keys(iterator_to_array($it));

这仅取决于您需要什么。

对于命名空间元素,这变得不那么直接。取决于您是否只想获取本地名称或命名空间名称,甚至是带有标签名称的命名空间 URI。

给定的SimpleXMLElementIterator可以更改为支持跨命名空间的元素迭代,默认情况下 simplexml 仅提供默认命名空间中元素的遍历:

/**
 * SimpleXMLElementIterator over all child elements across namespaces 
 */
class SimpleXMLElementIterator extends IteratorIterator implements RecursiveIterator
{
    private $element;

    public function __construct(SimpleXMLElement $element) {
        parent::__construct(new ArrayIterator($element->xpath('./*')));
    }

    public function key() {
        return $this->current()->getName();
    }

    public function hasChildren() {
        return (bool)$this->current()->xpath('./*');
    }

    public function getChildren() {
        return new self($this->current());
    }
}

然后,您需要检查每个元素的命名空间 - 作为使用命名空间的修改后的 XML 文档的示例:

<root xmlns="namspace:default" xmlns:ns1="namespace.numbered.1">
    <ns1:IpStatus>1</ns1:IpStatus>
    <ti_pid_20642>
        <dependend xmlns="namspace:depending">
            <ti-pid_2323>ti-pid_2323</ti-pid_2323>
            <ti_pid_anyumber>ti_pid_anyumber</ti_pid_anyumber>
            <more xmlns:ns2="namspace.numbered.2">
                <ti_pid_20642 ns2:attribute="test">ti_pid_20642</ti_pid_20642>
                <ns2:ti_pid_20642>ti_pid_20642</ns2:ti_pid_20642>
            </more>
        </dependend>
    </ti_pid_20642>
</root>

结合更新SimpleXMLIterator下面的示例代码演示了新行为:

$xml = new SimpleXMLElement($string);
$it  = new RecursiveIteratorIterator(
    new SimpleXMLElementIterator($xml), RecursiveIteratorIterator::SELF_FIRST
);

$count = 0;
foreach ($it as $name => $element) {
    $nsList = $element->getNamespaces();
    list($ns, $nsUri) = each($nsList);
    printf("#%d:  %' -20s  %' -4s  %s\n", ++$count, $name, $ns, $nsUri);
}

Output (Demo http://codepad.org/zc7rrgz6):

#1:  IpStatus              ns1   namespace.numbered.1
#2:  ti_pid_20642                namspace:default
#3:  dependend                   namspace:depending
#4:  ti-pid_2323                 namspace:depending
#5:  ti_pid_anyumber             namspace:depending
#6:  more                        namspace:depending
#7:  ti_pid_20642                namspace:depending
#8:  ti_pid_20642          ns2   namspace.numbered.2

玩得开心。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XML 解析使用但元素名称是动态的 的相关文章

  • 如何用PHP进行有向图绘制?

    我正在寻找一种在 PHP 中绘制有向图的方法 如http upload wikimedia org wikipedia commons 0 08 Directed acirclic graph png http upload wikimed
  • WordPress 中的 jQuery.post()

    我目前正在为 Wordpress 编写一个聊天框插件 该插件使用 jQuery post 方法将数据发送到 php 文件 以便将输出写入 html 文件 该文件又将使用 jQuery 加载到聊天窗口 在我用来将聊天日志写入html文件的ph
  • PHP、jQuery Ajax 和 json 跨域返回

    我的 php 编码页面位于一台返回 json 结果的服务器上 php 文件名为 getInfoData php 返回如下 echo json encode v 不 我可以使用 getJSON 读取 json 并在同一服务器上运行它 但我需要
  • 如何显示多维数组第二层的 json 值?

    解决此代码时遇到问题 这些是数组 Array 0 gt stdClass Object id gt 1 name gt delux price gt 213 description gt tv gt 0 breakfast gt 0 par
  • 使用factory faker创建的图像在存储在storage/public/images文件夹中时会被删除

    我正在尝试用假图像填充我的数据库 但是当 faker 将其保存到我的图像文件夹中时 一秒钟后它被删除 并且在我的数据库字段中我得到 0 我可以访问http lorempixel com http lorempixel com 也可以 pin
  • PHP:file_get_contents 与 json_decode 不能一起工作

    使用 file get contents 读取 json 文件后遇到问题 当我运行这段代码时 它工作正常
  • 将 DOCTYPE 添加到 Scala XML 的最简单方法?

    我怎样才能在 Scala XML 中制作这个最小的 HTML5 p p 当然 在 Scala 中制作类似 HTML 的 XML 很简单 gt val html p p html scala xml Elem p p 但是 我怎样才能注入DO
  • 登录代码示例已通过 SQL 注入被黑客攻击,尽管 mysql_real_escape_string...

    我使用 CodeIgniter 但在黑客攻击方面遇到了麻烦 是否可以对以下登录代码进行 SQL 注入 function process login username mysql real escape string this gt inpu
  • 执行数组内的函数

    是否可以从数组内部执行匿名函数 也在数组内部定义 return execute function logic 或者我应该在外面定义它然后再调用它 从技术上讲 您可以将该函数括在括号中并像这样调用它 return function retur
  • 显示过去 7 天 PHP 的结果

    我想做的是显示过去 30 天的文章 但我现有的代码不断给我一个 mysql fetch assoc 错误 然后追溯到我的查询 这是代码 sql mysql query SELECT FROM table WHERE DATE datetim
  • 在php中对带有特殊字符的多维数组进行排序

    我有一个多维数组 我按字母顺序排序 但问题是 带有丹麦语特殊字符 它们应该按该顺序排序 但不会按该顺序返回 这是我的数组 部分已删除 Array 0 gt Array Name gt John 1 gt Array Name gt Pate
  • FOSUserBundle & REST Api 调用:如何使用自定义 FormType?

    我在我的 Symfony2 网站上使用 FOSUserBundle 现在我正在开发一个 API 以允许通过 REST API 调用进行注册 我已经覆盖了 FOSUserBundle 的 RegistrationController ApiR
  • 如何使用 PHP 从 MySQL 查询中按升序对值进行排序?

    我使用以下 PHP 脚本从 MySQL 表中获取和更改数据 并将结果打印在 HTML 表中 我希望按升序对数据进行排序 utilization percentage变量 它是由创建的 total client time total avai
  • 通过 PHP 使用 Eclipse BIRT 报表设计器

    我想在 php web 项目中使用 Birt Reports 因此我安装了推荐的 Java Bridge 和 BIRT Runtime 将 JavaBridgeTemplate621 war 和 birt war 移至我的 Tomcat 之
  • zend 模块特定配置问题

    我使用 zend 框架构建 REST Web 服务 并且使用模块来分隔我的 api 版本 现在 我想为每个模块 v1 和 v2 都有一个单独的配置文件 主要用于指定单独的数据库连接 我有这样的目录结构 application modules
  • PHP 错误请求中 HTTP 请求失败

    我可以直接从浏览器请求 URL Web 服务 WS 但是当我在代码中使用 file get contents 或 fopen 方法时 我收到一条错误消息 有人有不使用curl的解决方案吗 public function sendHttpRe
  • 何时以及为何应使用 $_REQUEST 而不是 $_GET / $_POST / $_COOKIE?

    标题中的问题 当所有 3 个都发生时会发生什么 GET foo POST foo and COOKIE foo exist 其中哪一个被包含到 REQUEST 我想说永远不会 如果我想通过各种方法设置某些内容 我会为每个方法编写代码以提醒自
  • 从数据库生成 XML 时出现 PHP 编码错误 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试获取一个简单的 PHP 服
  • PHP邮件功能有时可以工作

    我正在编写一个脚本 需要通过PHP邮件功能发送电子邮件 如下所示 它在向 gmail 帐户发送电子邮件时有效 但在我的域中的帐户却无效 我们正在运行 Exchange 服务器 截至目前 电子邮件是从 www server 发送的 有谁知道
  • php 打印 aa aaa ab aab 直到 zzz 的算法

    你好 我需要打印从 a 到 zzz 最多 3 个字母 例如我的输出应该是 A B Z AA AB AZ BA BB ZZ AAA AAB ZZZ 我在过去的 5 个小时里努力尝试 我找不到任何逻辑 我尝试了下面的代码 PHP 有一个方便的功

随机推荐

  • 隐藏客户端点击的div

    试图让这个 div 消失 似乎没有做我期望的事情 我哪里出错了 它不会消失 JavaScript
  • 未考虑 Google 自定义搜索 imgSize 和 imgType

    当我进行自定义搜索时 它会按预期返回图像和格式化的 JSON 唯一没有预料到并且没有考虑到的就是参数 imgType 照片 图像尺寸 小 这对谷歌来说没有什么区别 我仍然收到剪贴画图像和非常大的图像 在某些情况下大于 2500 像素 有任何
  • 重置区域分配器,分配仍然有效

    在我的带有 MKMapView 的 ViewController 被取消初始化后 我在 XCode 10 2 1 中收到以下消息 内存 重置区域分配器 其中 24 个分配仍然有效 我在 ViewController 中使用以下代码来清理 M
  • 如何在expo React Native App中将api级别29更改为30

    当我将应用程序包上传到 Play 商店时出现此消息 您的应用程序当前面向 API 级别 29 并且必须至少面向 API 级别 30 以确保它基于针对安全性和性能进行优化的最新 API 构建 将应用程序的目标 API 级别更改为至少 30 如
  • 检测WinRT和Windows 8之间的差异

    对于统计跟踪 我希望能够判断应用程序是在 Windows RT 还是 Windows Pro 上运行 该线程表示无法获取系统版本信息 在 WinRT Metro 应用程序 C 中获取操作系统版本 https stackoverflow co
  • Python:嵌套循环

    考虑一下 gt gt gt a one two bad good gt gt gt for i in a for x in i print x one two bad good 我该如何编写这段代码 但使用如下语法 for i in a p
  • 如何更改 Visual Studio 2012、2013 或 2015 许可证密钥?

    我的机器上有一份 Visual Studio 2012 Pro 的副本 带有一个序列号 但我不再使用它 因为我必须使用另一个序列号 我的问题是我一直卸载 Visual Studio 但重新安装后注册信息仍然存在 并且我无法弄清楚我必须删除哪
  • 使用反射和枚举进行 MVC 应用程序访问的逻辑控制是否安全?

    Trying to manage access to a web site I created some necessary entities 目标是为我的 MVC 应用程序的某些控制器的操作方法使用自定义权限属性 Permissions
  • redis:备份dump.rdb

    Context 我有一个正在运行的 redis 服务器 我想做一个备份 Idea 我想做以下事情 cp dump rdb some other location 06 24 2012 rdb Concern 我没有看到任何东西向我承诺 du
  • 使用 ExecutorService 时出现 CancellationException

    我想等待两个任务完成然后返回它们的结果 但有时我会收到此错误 为什么 CancellationException从哪里来 public class ShouldVoteTask extends AbstractWorkerTask
  • python -m 用于预提交

    pip3 install pre commit gt 已安装 我都试过了python3 m pre commit version and pre commit version 它说找不到模块 我正在使用 Pycharm 并从 Github
  • Appium - 创建会话 - 错误:应提供 JSONWP 或 W3C 功能

    我无法让 Appium 启动 Android 会话 并且在网上搜索时没有找到与我收到的错误消息相关的任何内容 当我运行测试时 Appium 转储此日志 debug MJSONWP Calling AppiumDriver createSes
  • 用于在 Google 表格中进行多次查找和替换的 Google Apps 脚本

    关于 Stack Exchange 的第一个问题 希望它有意义 一些背景 我在学校环境中工作 并协助学习支持人员为某些学生创建更易读的时间表 他们从我们的网站复制时间表数据 其中包含科目代码 教师姓名和房间号 它的格式与您在下图中看到的格式
  • AngularJS 和怪异模式:IE8+ 上的空白屏幕

    我正在开发一个 Angular 项目 该项目将包含在我无法控制的 HTML 页面中 实际上我只能访问里面的内容元素 有许多限制并不容易处理 1 我无法更改文档类型 2 我无法删除此元标记 3 应用程序必须加载 XML 文件 我设法克服了第
  • 如何在 Eclipse-Helios JDT 中专门抑制“比较相同表达式”

    我尝试用注释封闭方法 SuppressWarnings compareIdentical 但这不起作用 更糟糕的是 注释会产生自己的结果 Unsupported SuppressWarnings compareIdentical 警告 我知
  • Xcode源代码控制查看历史修改文件失败

    I used Xcode要连接的源代码控制SVN服务器 查看源代码后 我执行了commit update 一切正常 但是当我点击源代码控制 gt 历史记录 然后单击 显示修改的文件 然后显示一个警报对话框 源代码管理操作失败 因为找不到工作
  • 如何与本机桌面 (win) 应用程序建立对等连接

    我需要与本机桌面 win 应用程序和网络浏览器建立对等连接 只是为了传输原始数据 从理论上讲 WebRTC 似乎是实现这一目标的唯一方法 如果您想使用 WebRTC 在浏览器和桌面之间交换数据 您可以使用此库将桌面部分编码为 C 语言 ht
  • 在 Android Activity 中从软件键盘监听 Webview 按键事件

    是否可以在 Android 主机应用程序中处理来自 Web 视图的软件键盘事件 例如 我的应用程序的 Activity 是否可以侦听显示 Google 网站的 Web 视图的搜索字段中键入的内容 考虑到下面描述的方法 如果我覆盖它返回 tr
  • 如何在 Python 中使用递归反转列表?

    我想要一个函数 它会使用递归返回给定列表的相反内容 我怎样才能做到这一点 将列表的第一个元素附加到反向子列表 mylist 1 2 3 4 5 backwards lambda l backwards l 1 l 1 if l else p
  • XML 解析使用但元素名称是动态的

    Simple XMLElement Object IpStatus gt 1 ti pid 20642 gt SimpleXmlElement Object 我有一个上面格式的 SimpleXMLElment 这个 XML 是在运行时生成的