PHPs SimpleXML ile kurulamıyor eklenti ad

3 Cevap php

Ben bir nitelik olarak xmlns:i eklemek için aşağıdaki çalıştım ben, bir Atom beslemesi oluşturma -

$node->addAttribute("xmlns:i","http://www.w3.org/2001/XMLSchema-instance"); 

Ben bir çıkış olarak bu var -

i="http://www.w3.org/2001/XMLSchema-instance"

"xmlns:" kısmı kesildi. Ben : karakter kaçmak gerekiyor? Ya da bu ad eklemek için başka bir yolu var mı?

3 Cevap

Eğer $ düğüme ad / öneki i bir nitelik eklemek istiyorsanız önceden ad bildirmek zahmet etmeyin. Sadece ilk parametre olarak kullanarak konum önek için ad alanı URI sağlamak için addAttribute üçüncü parametre () kullanın.

$node = new SimpleXMLElement('<root></root>');
$node->addAttribute("i:somename", "somevalue", 'http://www.w3.org/2001/XMLSchema-instance'); 
echo $node->asXml();

baskılar

<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" i:somename="somevalue"/>

Eğer kök elemana bir kukla özniteliği eklemek zorunda istemiyorsanız, bunu elle ad bildirebilirsiniz.

Bu mevcut bir cevap ima olarak ("Unable to add Attribute with Namespace Prefix using PHP Simplexml" ) by prefixing with xmlns: çalışır ve bu kök elemanın durumunda iki kez de adının bir parçası olarak:

$uri = 'http://www.w3.org/2001/XMLSchema-instance';

$root = new SimpleXMLElement("<root/>");
$root->addAttribute('xmlns:xmlns:i', $uri);
                     ######

$child = $root->addChild('foo');
$child->addAttribute( 'xmlns:i:bar', 'baz');
                       ######

echo $root->asXml();

(Okunabilirlik için elle biçimlendirilmiş) verir:

<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <foo i:bar="baz"/>
</root>

Yani bu xmlns: adýnýnönüne bunu hile gibi görünüyor. Eğer elemanı yeniden eğer after bu niteliğini ayarlayarak, bu öneki belirterek w / o çocuklar eklerken de ad alanı URI kullanmak mümkün olduğunu unutmayın:

$root = new SimpleXMLElement($root->asXML());

$child = $root->addChild('foo');
$child->addAttribute( 'i:bar', 'bazy', $uri);
                                       ####

echo $root->asXml();

(Okunabilirlik için elle biçimlendirilmiş) verir:

<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <foo i:bar="baz"/>
    <foo i:bar="bazy"/>
</root>

Bu ikinci örnek daha olasılıkla kullanım amaçlanan (veya muhtemelen daha fazla beklenen) tür gibi görünüyor. Bu doğru yapmak için tek yolu DOMDocument sister library. This is outlined in "How to declare an XML namespace prefix with DOM/PHP?" yapılmış kullanımı olduğunu.

Ben bu aynı şey için arıyor bulundu ve cevapların hiçbiri gerçekten benim için çalıştı. Yani, ben farklı bir yol denedi. SimpleXML doğru ad yönetmek değilse, bunun yerine DOM kullanmak.

Yani, böyle bir şey çalışması gerekir:

$s = new simplexmlelement('<root/>');
$d = dom_import_simplexml($s);
$d->setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:i", "http://www.w3.org/2001/XMLSchema-instance");
$s->addChild("bar", "bazy", "http://www.w3.org/2001/XMLSchema-instance");
$f = $s->addChild("foo", "quux");
$f->addAttribute("i:corge", "grault", "http://www.w3.org/2001/XMLSchema-instance");

İşte bu neden olur:

<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
   <i:bar>bazy</i:bar>
   <foo i:corge="grault">quux</foo>
</root>