Создание XML с атрибутом xmlns: xlink в узле

Я пытаюсь добавить генерировать вывод следующим образом:

<mets .... xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/METS/ http://www.loc.gov/standards/mets/mets.xsd"> 

Я могу сгенерировать все отлично, но не могу добавить атрибут xmlns:xlink . Самое близкое, что я получаю:

 $this->xml = new SimpleXMLElement('<mets></mets>'); $mets->addAttribute("xlink:someName", "blabla", "http://www.w3.org/1999/xlink"); $mets->addAttribute("xsi:schemaLocation", "http://www.loc.gov/METS/ http://www.loc.gov/standards/mets/mets.xsd", "http://www.w3.org/2001/XMLSchema-instance"); 

Формирует:

 <mets .... xmlns:xlink="http://www.w3.org/1999/xlink" ----begin of part I don't desire----- xlink:someName="blablabla" ----end of part I don't desire----- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/METS/ http://www.loc.gov/standards/mets/mets.xsd"> 

Как добавить xmlns:xlink без добавления xlink:somethingElse ?

Related of "Создание XML с атрибутом xmlns: xlink в узле"

Решение, которое я придумал, довольно прямолинейно:

Потому как

 $mets->addAttribute("xlink:someName", "", "http://www.w3.org/1999/xlink"); 

всегда добавляет два атрибута: один для объявления пространства имен ( xmlns:xlink ), а затем добавленный вами атрибут ( xlink:someName ) – все, что вам нужно сделать, – это удалить нежелательный добавленный атрибут, и атрибут пространства имен префиксов останется:

 unset($mets->attributes('xlink', true)['someName']); 

Полный пример:

 $mets = new SimpleXMLElement('<mets></mets>'); $mets->addAttribute("xlink:someName", "", "http://www.w3.org/1999/xlink"); unset($mets->attributes('xlink', true)['someName']); echo $mets->asXML(); 

Вывод:

 <?xml version="1.0"?> <mets xmlns:xlink="http://www.w3.org/1999/xlink"/> 

Однако это обычно не обязательно. Вам нужно либо использовать пространство имен для чего-то – тогда simplexml добавит его по мере необходимости – или вам это не понадобится, тогда нет необходимости его добавлять.

Сам XML не требует вообще объявлять пространство имен, которое не используется. Поэтому вы, вероятно, тоже можете его оставить, или вам нужно только добавить его туда, где вам нужно его добавить, например, конкретный элемент / атрибут xlink позже.

Любой синтаксический анализатор XML, поддерживающий пространства имен, будет поддерживать любой хорошо сформированный документ XML + Namspaces, поэтому действительно не должно быть причин беспокоиться, имеет ли корневой элемент это объявление и с каким префиксом. Simplexml просто позаботится об этом, просто добавьте атрибут xlink, где он вам нужен. Пример:

 $mets = new SimpleXMLElement('<mets></mets>'); $child = $mets->addChild('child'); $child->addAttribute('xlink:href', 'child.xml', 'http://www.w3.org/1999/xlink'); $child = $child->addChild('child'); $child->addAttribute('xlink:href', 'child.xml', 'http://www.w3.org/1999/xlink'); echo $mets->asXML(); 

Вывод:

 <?xml version="1.0"?> <mets> <child xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="child.xml"> <child xlink:href="child.xml"/> </child> </mets>