读取 XML 属性并获取其值

2024-01-06

我对这个 XML 问题很感兴趣,我有一个 XML 文件,我可以浏览该文件来查找值。一切工作正常,我可以阅读所有子节点,但我被困在这一部分。包含照片的XML部分都是相同的节点名称,除了一个属性之外,我如何指定如何根据此浏览并获取每个文件的文件名值

XML 
...
<Engine>
            <Fuel>Unleaded</Fuel>
            <Cylinders>4</Cylinders>
            <Induction>Normally aspirated</Induction>
          </Engine>
          <Photo order="1">
            <Filename>http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_2.jpg</Filename>
          </Photo>
          <Photo order="2">
            <Filename>http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_3.jpg</Filename>
          </Photo>
          <Photo order="3">
            <Filename>http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_4.jpg</Filename>
          </Photo>
          <Photo order="4">
            <Filename>http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_5.jpg</Filename>
          </Photo>
          <Photo order="5">
            <Filename>http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_6.jpg</Filename>

...

在我的 php 文件中,我有以下代码可以帮助我找到这些值:

$import->stock_no =(string)$item->Invoice->Vehicle->VehicleStock;           

$import->image1 =(string)$item->Invoice->Vehicle->Photo->attributes(order="1")->Filename; 

当然不行,我怎样才能浏览所有照片节点(我有8张图片,我需要从中获取值)

我想要 $import->image1 = (照片 1 属性中的文件名),图像 2、3 等也是如此。

谢谢。


您尝试实现的目标(首先)可以通过使用 xpath 查询来实现。您想要根据属性值访问子节点。 SimpleXML 中比较好的参考问题是:

  • 在 XPath 中实现条件 https://stackoverflow.com/q/3448005/367456
  • SimpleXML根据属性值获取元素内容 https://stackoverflow.com/q/4736417/367456

也是从几天开始,就有人提出延长表格的建议SimpleXMLElement提供一个实用函数,通过一个简单的界面来实际做到这一点:

  • PHP/XML - 如何读取多个子内容 https://stackoverflow.com/a/16921116/367456
  • simplexml_load_file - 具有空值的冗余元素转换为新的 SimpleXMLElement 对象 https://stackoverflow.com/a/17404930/367456

但是,由于您建议的语法,您的情况略有不同:

$xml = simplexml_load_string($buffer, 'MySimpleXMLElement');

echo $xml->Vehicle->Photo->attribute("order", "1")->Filename;

// prints "http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_2.jpg"

而不是使用普通的SimpleXMLElement此示例使用名为(示例性)的扩展MySimpleXMLElement。它根据输入参数和它所操作的父元素(这里是一个Photo元素):

/**
 * Class MySimpleXMLElement
 *
 * Example of how to magically access named child-nodes based
 * on an attribute value of theirs.
 */
class MySimpleXMLElement extends SimpleXMLElement
{
    public function attribute($name, $value) {

        $nodes = $this->xpath(
            sprintf('../%s[@%s = "%s"]', $this->getName(), $name, $value)
        );

        return $nodes ? $nodes[0] : NULL;
    }
}

这个新的MySimpleXMLElement::attribute()方法(抱歉attributes()已在使用 http://php.net/simplexmlelement.attributes) 然后在每个节点上都可用。所以玩得开心吧。

当然你也可以这样写:

$xml = simplexml_load_string($buffer);

echo $xml->Vehicle->xpath('Photo[@order="1"]')[0]->Filename;

// prints "http://usedcarpics.s3.amazonaws.com/514SPINELLITOYOTA2/b5092588_2.jpg"

扩展SimpleXMLElement主要是为了方便起见。如果您还不熟悉 Xpath,那么调试可能会更容易。

上次我在 Stackoverflow 上扩展 SimpleXMLElement 是在上述内容中回答“simplexml_load_file - 具有空值的冗余元素被转换为新的 SimpleXMLElement 对象”问题 https://stackoverflow.com/a/17404930/367456.

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

读取 XML 属性并获取其值 的相关文章

随机推荐

  • WPF - 使ListView(GridView)滚动时数据太多?

  • 当未找到 id 时,查询会产生 1 行包含空值的结果

    确切的查询 SELECT coupon coupons code coupon coupons discountType作为 类型 coupon coupons discountAmount作为 金额 coupon coupons disc
  • 复合键的 Hibernate 标准问题

    我得到了这个休眠映射
  • Ogre g++ 编译时错误

    在ubuntu上 我已经编译并安装了所有的ogre库 但是 当我尝试使用此命令编译教程时 g o otest ogre cpp I pkg config libs cflags OGRE OIS lOgreMain lOI 它输出 tmp
  • PostgreSQL 上不存在 Doctrine 列 id

    我被迫使用PostgreSQL 我已经读过一些相关内容 但它仍然是新的 我不知道为什么会收到此错误 SQLSTATE 42703 Undefined column 7 ERROR column t0 id does not exist LI
  • 线程或服务

    我对 Android 上的线程和服务感到困惑 如果我必须从服务器下载一些文件 一次可能有多个文件 在这种情况下我应该选择什么 线程还是服务 在这种情况下我应该选择什么线程或服务 这不是一个 或 这是一个 和 您使用后台线程and一项服务 从
  • 以编程方式创建可同步的 Android 日历

    我开发了一个应用程序功能 可以通过应用程序创建和同步本地电话日历 现在我必须在线同步此日历 最好通过本机电话帐户 我尝试通过帐户名称和类型扩展 URI 的内容值参数 请参阅下面的 API LVL id sync account sync a
  • gnuplot 中的历史记录自动完成

    在 gnuplot 中 我输入 gnuplot gt set style data lines 然后我运行其他几行 gnuplot gt plot data traj1 dat u 1 4 u 1 6 u 1 9 u 1 11 u 1 13
  • 当我将其构建为 Android 应用程序包时,为什么我的 Android 应用程序无法运行?

    我想开始将我的应用程序发布为 AAB 我成功构建了我的构建 aab文件并决定尝试在我的手机上安装应用程序 我用下一个方法 1 使用命令从 aab 文件构建 APK 集 java jar bundletool jar build apks b
  • VHDL 上的反转位顺序

    我在做类似的事情时遇到困难 b 0 to 7 lt a 7 downto 0 当我用ghdl编译它时 出现顺序错误 我发现使我的电路工作的唯一方法如下 library ieee use ieee std logic 1164 all ent
  • Android 库项目自定义构建

    我有一个遗留应用程序 需要将其拆分为一个库项目 通用代码 和两个应用程序项目 付费和免费应用程序 我不使用 Eclipse 进行开发 也不使用 Android SDK 提供 生成 的 Ant 构建 有几个原因 不同的项目目录结构 集成到构建
  • 使用java从jar作为资源播放.wav文件

    我想使用 jar 文件中的 java 代码作为资源来播放 wav 文件 我的代码是这样的 try URL defaultSound getClass getResource images ads WindowsNavigationStart
  • 如何获取HTTP 404响应的响应内容

    有没有比直接通过 tcp 访问主机更简单的方法来获取 HTTP 404 响应的内容 这是 404 响应的示例 内容如下 HTTP 1 1 404 Object Not Found Server CouchDB 1 3 0 Erlang OT
  • 连接分层模块:SystemVerilog 中的结构与接口

    在 SystemVerilog 中 分层模块可以通过简单数据类型 复杂数据类型 结构 联合等 或接口进行连接 我感兴趣的功能是将两个模块之间的所有信号聚合到一个地方 这简化了代码的维护 例如 在下面的例子中 更改 s point 的定义而不
  • 是否将指针移动到结构成员 UB 的后面?并访问它?

    看看这个片段 struct S float x y z void fn S s 0 0 0 float p s x p 2 1 if constexpr sizeof S sizeof float 3 if S has no padding
  • 复制链表中的结构

    在这里 我将结构从一个节点复制到另一个节点 但是当我遇到最后一个节点时 我将出现分段错误 因为temp clsf gt next in memcpy将指向无效位置 我该如何解决这个问题 我无法自由temp clsf因为它不是动态分配 whi
  • C# 使用递归从 List 创建 HTML 无序列表

    是否可以使用递归输出以下 HTML 无序列表 ul li 1 ul li 5 ul li 8 li li 9 li ul li li 6 li ul li li 2 li li 3 li li 4 li li 7 li ul 原始数据保存在
  • 如何按特定顺序获得电源组?

    有一些计算幂集的解决方案 但我在谷歌上找到的这些解决方案并没有按我需要的顺序给出幂集 例如 如果我想要的幂集 1 2 3 4 常见算法为我提供了一个幂集 以下顺序 1 2 1 2 3 1 3 2 3 1 2 3 4 1 4 2 4 1 2
  • Python PyInstaller 和包含图标文件

    我正在使用 PyInstaller v1 5 构建一个可执行文件 另外 我正在使用 GUI2EXE 来帮助我 我的脚本需要位于工作目录中的图标文件 icon file pics myicon ico 当我构建可执行文件时 我希望不必包含 工
  • 读取 XML 属性并获取其值

    我对这个 XML 问题很感兴趣 我有一个 XML 文件 我可以浏览该文件来查找值 一切工作正常 我可以阅读所有子节点 但我被困在这一部分 包含照片的XML部分都是相同的节点名称 除了一个属性之外 我如何指定如何根据此浏览并获取每个文件的文件