It took me some time to finally figure this out since nobody had blogged about it or documented it anywhere that I could find.
I was trying to define a namespace and use a namespace as attributes like so:
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="AmazonCustomerByEmail">
<EmailAddress>user@company.com</EmailAddress>
</Grantee>
I was using the following thinking that when they asked for the namespace, they actually meant the namespace.
<?php
$simplexml->addAttribute('xsi', 'http://www.w3.org/2001/XMLSchema-instance', 'xmlns');
$simplexml->addAttribute('type', 'AmazonCustomerByEmail', 'xsi');
?>
Instead, they want the name to have the namespace attached, and to pass the namespace URL as the third parameter. Also by doing this, the xmlns:xsi="url" gets added automatically. I had no idea.
After an hour of non-stop digging, I dug through the CVS commit messages and found a clue which led me to this working code:
<?php
$simplexml->addAttribute('xsi:type', 'AmazonCustomerByEmail', 'http://www.w3.org/2001/XMLSchema-instance');
?>
SimpleXMLElement::addAttribute
(PHP 5 >= 5.1.3)
SimpleXMLElement::addAttribute — SimpleXML 要素に属性を追加する
説明
void addAttribute
( string $name
, string $value
[, string $namespace
] )
SimpleXML 要素に属性を追加します。
パラメータ
- name
-
追加する属性の名前。
- value
-
属性の値。
- namespace
-
指定されている場合は、その属性が所属する名前空間。
返り値
値を返しません。
例
例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();
?>
SimpleXMLElement::addAttribute
Ryan Parman (Skyzyx)
02-Dec-2008 12:36
02-Dec-2008 12:36
khishigbaatar at 2xcoding dot com
12-Nov-2008 11:44
12-Nov-2008 11:44
simpleXML have only read/write methods, so to remove attributes in nodes, there is a simple way even without DOM extension. Use unset();
Example:
if "samlpe.xml" contains
<?xml version="1.0"?>
<books>
<book author="unknown">The Secret History of the Mongols</book>
<book author="Jack Weatherford">Genghis Khan and the Making of the Modern World</book>
<book author="David Morgan">The Mongols (The Peoples of Europe)</book>
<book author="Stephen Turnbull">Mongol Warrior 1200-1350</book>
<book author="Marco Polo">The Travels of Marco Polo</book>
<book author="J. J. Saunders">The History of Mongol Conquests</book>
</books>
<?php
// load xml file
$xml = simplexml_load_file("sample.xml");
// remove first book's attribute
unset($xml->book[0][author]);
// write xml file
$xml->asXML("sample.xml");
?>
Now "sample.xml" is:
<?xml version="1.0"?>
<books>
<book>The Secret History of the Mongols</book>
<book author="Jack Weatherford">Genghis Khan and the Making of the Modern World</book>
<book author="David Morgan">The Mongols (The Peoples of Europe)</book>
<book author="Stephen Turnbull">Mongol Warrior 1200-1350</book>
<book author="Marco Polo">The Travels of Marco Polo</book>
<book author="J. J. Saunders">The History of Mongol Conquests</book>
</books>
That's it.
cbrand at dodgeit dot com
21-Mar-2007 01:49
21-Mar-2007 01:49
It may be helpful to note that the addAttribute method checks the length of the fields to determine whether or not they are empty. In otherwords if you are trying to addElement("patent_holder", "") this will fail as the strlen is 0.
