Создание 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?
1 ответ:
Решение, которое я придумал, довольно прямолинейно:
Потому что
$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();Вывод:
Однако обычно в этом нет необходимости. Вы либо должны использовать пространство имен для чего - то - тогда simplexml добавит его при необходимости-или вам это не нужно, тогда нет необходимости добавлять его.<?xml version="1.0"?> <mets xmlns:xlink="http://www.w3.org/1999/xlink"/>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>
Comments