PHP XML - 在特定位置插入 XML 节点

2024-04-24

我想在 XML 文件中的特定位置插入一个带有子节点的节点。我该怎么做?

例如。如果我有一个像这样的 XML:

<myvalues>
 <image name="img01">
    <src>test</src>
 </image>

 <image name="img02">
    <src>test</src>
 </image>

 <image name="img03">
    <src>test</src>
 </image>
</myvalues>

我想插入:

<image name="img11">
  <src>test2</src>
</image>

between <image name="img01"> & <image name="img02">。我该怎么做呢?我现在正在使用 SimpleXML 来读取 XML。

Thanks.

编辑:我尝试了以下代码。但是,新节点被添加到 XML 结构之外的 XML 底部。

$xml = new DomDocument();


$xml->preserveWhitespace = false;
 $xml->load('myXMLFile.xml');

 $newNode = $xml->createElement('tryimage');

 $xpath = new DOMXpath($xml);
 $elements = $xpath->query('/myvalues/image[name="img01"]');

 $refNode = $elements->item(0);

 $xml->insertBefore($newNode, $refNode->nextSibling);


 header('Content-Type: text/plain');
 echo $xml->saveXML();

输出是这样的:

<xml....>
   <myvalues>
     <image name="01">
     </image>
     .
     .
     .
   </myvalues>
<tryimage />

好吧,我认为 SimpleXML 没有简单的方法(毕竟它应该很简单)。

一种方法是将 myvalues 节点移至 DOMDocument,在其中添加节点,然后将其替换为 dom 节点。鉴于$myvalues是你的<myvalues>SimpleXML 中的节点:

$domMyValues = dom_import_simplexml($myvalues);
$newNode = $domMyValues->ownerDocument->createElement('mynewelement');
//Apply attributes and whatever to $newNode

//find the node that you want to insert it before (from the $domMyValues class
$nodes = $domMyValues->getElementsByTagName('image');
$refNode = null;
foreach ($nodes as $node) {
    if ($node->getAttribute('name') == 'img02') {
        $refNode = $node;
    }
}
$domMyValues->insertBefore($newNode, $refNode);

请注意,无需转换回 SimpleXML,因为对 DOMElement 的任何更改都将自动应用于 SimpleXML 版本...如果找不到,它将自动附加新的子元素$refNode(因为它不存在等)...

编辑:添加 XPath

将 foreach 块替换为以下内容(功能等效,如果我的查询正确的话):

$xpath = new DOMXpath($domMyValues->ownerDocument);
$elements = $xpath->query('//image[@name="img02"]');
$refNode = $elements->item(0);

Since DOMNodeList::item()对于不存在的偏移量返回 null,我们甚至不需要检查其中是否有项目。

现在,您可能需要/想要调整 xpath 查询以更加/不具体。这是一个不错的教程 http://www.w3schools.com/xpath/...

Edit 2

我忘记了 xpath 需要一个@告诉它检查属性的字符。

这是我的工作代码(因为我不知道你的确切架构):

$x = '<?xml version="1.0" ?>
<myvalues>
        <images>
                <image name="01">Foo</image>
                <image name="02">Bar</image>
        </images>
</myvalues>';

$dom = new DomDocument();
$dom->loadXML($x);
$xpath = new DOMXpath($dom);

$elements = $xpath->query('//images/image[@name="01"]');
$elements = $xpath->query('//image[@name="01"]');
$elements = $xpath->query('/myvalues/images/image[@name="01"]');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP XML - 在特定位置插入 XML 节点 的相关文章

随机推荐

  • XmlReader AppendChild 未附加相同的子值

    XmlElement updateRecipient doc CreateElement UpdateRecipient XmlElement email doc CreateElement EMAIL XmlElement listID
  • 是否有适用于 IE6 的 JavaScript PNG 修复程序允许 CSS 背景定位?

    我已经看到了一些允许 PNG 图像在 Internet Explorer 6 中具有透明度的修复 但我还没有找到一个也允许您在 CSS 中设置背景位置的修复 如果你使用精灵 那就会破坏交易 我求助于使用 GIF 质量不高 根本不使用透明图像
  • Django QuerySet 何时被评估?

    我读过 django 查询集是懒惰的 但这是否意味着懒惰 因为我可以在一个语句上链接多个操作 或者懒惰 因为查询被延迟到需要结果的时候 例如 以下模拟代码是否执行两个或三个 SQL 查询 query Books objects filter
  • StreamWriter.Flush() 和 StreamWriter.Close() 有什么区别?

    两者在功能上有什么区别StreamWriter Flush and StreamWriter Close 当我的数据没有正确写入文件时 我添加了两个Flush and Close 到我的代码的末尾 然而 我意识到添加either Flush
  • 具有来自包含器类的静态方法调用的 Ruby 模块

    我需要在模块中定义使用包含该模块的类中的方法的常量 module B def self included base class lt lt base CONST self find end end end class A def self
  • 如何确保以编程方式发送的电子邮件不会被自动标记为垃圾邮件?

    这是一个棘手的问题 我一直依赖技术 例如基于许可的电子邮件 即仅发送给您有权发送的人 而不是公然使用spamish术语 最近 我以编程方式发送的一些电子邮件开始被自动混入人们的垃圾邮件文件夹中 我想知道我能对此做些什么 尽管这些特定的电子邮
  • 为什么空 python 正则表达式搜索的返回值是匹配的?

    将空字符串传递给正则表达式对象时 搜索结果是匹配对象而不是 None 因为没有任何东西可以匹配 所以它应该是 None 吗 import re m re search some text if m is None print Returne
  • 从新线程更新 JProgressBar

    如何从另一个线程更新 JProgressBar setValue int 我的第二个目标是用尽可能少的课程来完成它 这是我现在的代码 Part of the main class pp addActionListener new Actio
  • 在 F# 中组合谓词

    F 中是否有逻辑组合谓词的标准方法 例如 假设我有isCar x and isBlue x然后我想要一些能给我的东西 let isBlueCar x isCar x isBlue x 但是使用某种组合而不是调用 可能像 let isBlue
  • 扫描大量BLE标签

    我一直在寻找在一次扫描中扫描大量 BLE 标签 StickNFind 的可能性 我注意到 当我扫描 10 秒时 我可以轻松检测到大约 20 个 BLE 当我将扫描间隔增加到 30 秒左右并尝试扫描大量 BLE 标签时 例如200 个标签 我
  • WPF:无法控制键盘焦点

    这周我遇到了一个让我陷入困境的问题 总而言之 问题是当我左键单击另一个控件时 我无法从代码中将键盘焦点赋予 ComboBox 具体来说 我有一个 CustomControll 它有一个 Scrollview 其中包含另一个 CustomCo
  • 与使用类相比,在 Program.cs/main 中编写代码是否有充分的理由? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在开发一个相当大的应用程序 而我的技术主管和我在某些事情上的看法并不一致 其中之一是关于控制台应用程序 这些应用程序正在从 shell 脚本移植到
  • 无法在我的 Maven 项目中使用依赖项 jboss-javaee-6.0

    我已经使用 JBoss 7 1 1 设置了一个 Maven 项目 我想使用 JavaEE 库 在根 pom xml 中我设置了
  • 实体框架:唯一(非主键)父字段上的复合外键

    我有一个表需要通过其绑定到另一个表Id列 并按其第三个表 Id Code 列 我可以轻松地做SQL服务器同时使用主键和唯一索引 但不知道如何实现它实体框架 如果我把 Key 两列上的属性 那么我无法创建第一个关系 否则 如果我只申请一个 K
  • 适用于 Windows 的二进制 python 包(模块)的无人值守安装

    是否没有合理的方法来执行 Windows 二进制 python 包的脚本安装 不幸的是 似乎几个基本的 Windows python 软件包 如 pywin32 和 py2exe 只能以 EXE 形式提供 而不是以 MSI 形式提供 据我所
  • fopen() 在 Linux 上创建文件失败

    我正在尝试通过创建一个文件fopen 如下 但不创建该文件并让我 Can t create file P S 我在 Linux Ubuntu 上使用 LAMP 服务器 在创建该文件之前我已经尝试过以下命令 sudo chmod R 755
  • 陷入状态 Monad

    我想使用节点和唯一键的 IntMap 创建一个图形结构 这个话题已经被很好地涵盖了here https stackoverflow com questions 12941625 ids from state monad in haskell
  • python sqlite3更新不更新

    问题 为什么这个sqlite3语句没有更新记录 Info cur execute UPDATE workunits SET Completed 1 AND Returns WHERE PID AND Args pickle dumps Re
  • sql server 存储过程首次运行缓慢

    我有一个存储过程 每天在午夜过后运行九次 它不是一个理想的存储过程 但您知道它是怎样的 没有任何计划能够与现实接触 此存储过程通常需要大约一分钟的时间来运行 根据其处理的数据量给出或花费一些时间 然而 在给定早晨的第一次运行中 有时会花费大
  • PHP XML - 在特定位置插入 XML 节点

    我想在 XML 文件中的特定位置插入一个带有子节点的节点 我该怎么做 例如 如果我有一个像这样的 XML