SimpleXMLElement::addAttribute

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

SimpleXMLElement::addAttribute 向 SimpleXML 元素添加属性

描述

public SimpleXMLElement::addAttribute(string $qualifiedName, string $value, ?string $namespace = null): void

向 SimpleXML 元素添加属性。

参数

qualifiedName

要添加的属性的名称。

value

属性的值。

namespace

如果指定,则属性所属的命名空间。

返回值

不返回值。

范例

注意:

列出的示例可能包括 example.php,它指的是 基本用法 指南第一个示例中找到的 XML 字符串。

示例 #1 向 SimpleXML 元素添加属性和子元素

<?php

include 'example.php';

$sxe = new SimpleXMLElement($xmlstr);
$sxe->addAttribute('type', 'documentary');

$movie = $sxe->addChild('movie');
$movie->addChild('title', 'PHP2: More Parser Stories');
$movie->addChild('plot', 'This is all about the people who make it work.');

$characters = $movie->addChild('characters');
$character = $characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');

$rating = $movie->addChild('rating', '5');
$rating->addAttribute('type', 'stars');

echo
$sxe->asXML();

?>

上面的示例将输出类似于以下内容

<?xml version="1.0" standalone="yes"?>
<movies type="documentary">
 <movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#xD3;r</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <great-lines>
   <line>PHP solves all my web problems</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
 <movie>
  <title>PHP2: More Parser Stories</title>
  <plot>This is all about the people who make it work.</plot>
  <characters>
   <character>
    <name>Mr. Parser</name>
    <actor>John Doe</actor>
   </character>
  </characters>
  <rating type="stars">5</rating>
 </movie>
</movies>

参见

添加备注

用户贡献的备注 7 个备注

Patanjali
8 年前
您无法使用它来更新现有属性的值。

相反,获取 SimpleXMLElement 的 DOM 版本并使用 setAttribute,如下所示

$XML = '<element a="aa">Text</element>';
$snode = new simple_xml_element($XML);

$dnode = dom_import_simplexml($snode);
$dnode->setAttribute('a', 'bb');

节点的生成 XML 为
<element a="bb">Text</element>
booleer at yahoo dot it
13 年前
如果属性已经存在,addAttribute 不会执行任何操作。

示例
<?php
$xml_string
= <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<root>
<item id="foo">
<root>
XML;

$xml = simplexml_load_string($xml_string);
$xml->item->addAttribute('id', 'bar');
echo
$xml->asXML();
?>

上面的示例将输出
<?xml version="1.0" encoding="UTF-8"?>
<root>
<item id="foo">
<root>
caffeinatedbits
1 年前
刚刚发现另一个宝石。需要删除属性?这也很简单!

<?php

$xml
= <<<EOF
<?xml version="1.0" encoding="utf-8" ?>
<Animals>
<Dog breed="chihuahua"/>
</Animals>
EOF;

$animals = new SimpleXMLElement($xml);

echo
$animals->Dog->asXML();
// <Dog breed="chihuahua"/>

unset($animals->Dog['breed']);

echo
$animals->Dog->asXML();
// <Dog/>

?>
caffeinatedbits
1 年前
我需要一种更新属性的方法,但我找不到任何文档化的方法来做到这一点。

经过多次尝试,以下是我的发现,什么有效 - 答案是如此简单,我花了 8 次尝试才弄明白 :-)

给出以下示例

<?php

$xml
= <<<EOF
<?xml version="1.0" encoding="utf-8" ?>
<Animals>
<Dog/>
</Animals>
EOF;

$animals = new SimpleXMLElement($xml);

echo
$animals->Dog->asXML();
// <Dog/>

?>

测试 #6 - 或许直接修改 attributes() 迭代器就像修改数组一样会暗中调用 __set() 魔术方法?

TL;DR: 是的

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo
$animals->Dog->asXML();
// <Dog breed="chihuahua">

$dogAttrs = $animals->Dog->attributes();
// object(SimpleXMLElement)#4 (1) {
// ["@attributes"]=>
// array(1) {
// ["breed"]=>
// string(9) "chihuahua"
// }
// }

$dogAttrs['breed'] = "poodle";
// 工作!

echo $animals->Dog->asXML();
// <Dog breed="poodle">

?>

测试 #7 - 或许我甚至不需要调用 attributes()?

TL;DR: 我当然不需要!

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo
$animals->Dog->asXML();
// <Dog breed="chihuahua">

$animals->Dog['breed'] = "poodle";
// 有效!

echo $animals->Dog->asXML();
// <Dog breed="poodle">

?>

测试 #8 - 也许我从来不需要调用 addAttribute()?

TL;DR: 不需要,我可以完全跳过它!

<?php

...

$animals->Dog['breed'] = "chihuahua";
// 有效!

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

$animals->Dog['breed'] = "poodle";
// 有效!

echo $animals->Dog->asXML();
// <Dog breed="poodle">

?>

FYI: 我还提交了另一份单独的笔记,说明哪些方法不起作用,以防您像我一样好奇并尝试其他方法。
p.servus
12 年前
如果需要命名空间,必须将命名空间前缀 + 属性名称(“前缀:名称”)作为第一个参数,并将 URI 作为第三个参数。(我不知道为什么?!)

示例代码
<?php
$xml
= new SimpleXMLElement("<packagedElement></packagedElement>");
$xml->addAttribute("xmi:type", "uml:Class", "http://schema.omg.org/spec/XMI/2.1");
echo
$xml->asXml();
?>

输出
<packagedElement xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmi:type="uml:Class"></packagedElement>
caffeinatedbits
1 年前
我需要一种更新属性的方法,但我找不到任何文档化的方法来做到这一点。

TL;DR: 它不仅是可能的,而且非常简单。请查看我提交的另一份笔记,了解实际有效的操作方法(抱歉,由于 4095 个字符的限制,我无法将所有内容都放在一个笔记中)。

经过大量实验,我发现以下方法不起作用;希望它能为您节省我所花费的时间和挫折。

给出以下示例

<?php

$xml
= <<<EOF
<?xml version="1.0" encoding="utf-8" ?>
<Animals>
<Dog/>
</Animals>
EOF;

$animals = new SimpleXMLElement($xml);

echo
$animals->Dog->asXML();
// <Dog/>

?>

测试 #1 - 尝试两次调用 addAttribute()

TL;DR: PHP 警告:SimpleXMLElement::addAttribute(): 属性已存在

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo
$animals->Dog->asXML();
// <Dog breed="chihuahua"/>

$animals->Dog->addAttribute('breed', "poodle");
// PHP 警告:SimpleXMLElement::addAttribute(): 属性已存在

echo $animals->Dog->asXML();
// <Dog breed="chihuahua"/>

?>

测试 #2 - 尝试通过引用迭代 attributes()(迭代器)

TL;DR: 无法通过引用将迭代器与 foreach 一起使用

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo
$animals->Dog->asXML();
// <Dog breed="chihuahua">

try {
foreach (
$animals->Dog->attributes() as $attr => &$value) {
if (
"breed" === $attr) {
$value = "poodle";
}
}
} catch (
Throwable $e) {
echo
$e->getMessage();
// 无法通过引用将迭代器与 foreach 一起使用
}

echo
$animals->Dog->asXML();
// <Dog breed="chihuahua">

?>

测试 #3 - 尝试重新解析子元素,然后对新解析的元素调用 addAttribute(),如我在此处找到的一份笔记中所建议的那样

TL;DR: PHP 警告:SimpleXMLElement::addAttribute(): 属性已存在

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo
$animals->Dog->asXML();
// <Dog breed="chihuahua">

$animals->Dog = new SimpleXMLElement($animals->asXML());

$animals->Dog->addAttribute('breed', "poodle");
// PHP 警告:SimpleXMLElement::addAttribute(): 属性已存在

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

?>

测试 #4 - 尝试修改 @attributes 数组元素

TL;DR: PHP 注意:SimpleXMLElement 的重载元素的间接修改无效

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo
$animals->Dog->asXML();
// <Dog breed="chihuahua">

$dogAttrs = $animals->Dog->attributes();
// object(SimpleXMLElement)#4 (1) {
// ["@attributes"]=>
// array(1) {
// ["breed"]=>
// string(9) "chihuahua"
// }
// }

$dogAttrs['@attributes']['breed'] = "poodle";
// PHP 注意:SimpleXMLElement 的重载元素的间接修改无效

echo $animals->Dog->asXML();
// <Dog breed="chihuahua">

?>

测试 #5 - 将 attributes() 转换为数组,并设置 'breed' 元素的值

TL;DR: 不会更新原始对象中的值

<?php

...

$animals->Dog->addAttribute('breed', "chihuahua");

echo
$animals->Dog->asXML();
// <Dog breed="chihuahua">

$dogAttrs = (array) $animals->Dog->attributes();
// array(1) {
// ["@attributes"]=>
// array(1) {
// ["breed"]=>
// string(9) "chihuahua"
// }
// }

$dogAttrs['@attributes']['breed'] = "poodle";

echo
$animals->Dog->asXML();
// <Dog breed="chihuahua">

?>
sarlak
13 年前
您可以通过以下方式访问节点的子元素:

<?php
$root
= new SimpleXMLElement($filePath);
echo
$root->nodeName->attributes;

// 它可以递归工作,因此以下方法也适用
echo $root->nodeName->subNodeName->attributes();
?>

但是,如果要为子元素添加属性,则必须使用 children() 方法来访问并修改它,否则它将修改父元素的属性。

<?php
// 添加子节点
$element->nodeName->addChild('subNodeName', "你想写的内容");

// 获取父节点子节点的最后位置
$lastNodePos = $element->nodeName->count()-1;

// 获取父节点的子节点
$nodeChildrens = $element->nodeName->children();

// 给最后一个创建的节点添加属性
$nodeChildrens[$lastNodePos]->addAttribute('attributeName', "属性值);
?>
To Top