2015-07-01 2 views
2

Я пытаюсь добавить новый узел внутри XML, с пространством имен, который не определен, я пытался использовать SimpleXMLElement, чтобы добавить это пространство имен и создать узел вроде:Как добавить пространство имен и использовать его внутри XML-документа с помощью SimpleXML (PHP)?

<namespace:nodename> 

, но когда я делаю, SimpleXMLElement дает что-то вроде этого:

<nodename xmlns:namespace="namespace"> 

Вот код, который я написал:

$xml->addAttribute('xmlns:namespace', $url); 
$xml->metadata->addChild('namespace:nodename', null, 'namespace'); 

И вот XML, что я пытаюсь чан e:

<?xml version="1.0" encoding="UTF-8"?> 
<manifest xmlns="http://www.imsproject.org/xsd/imscp_rootv1p1p2" identifier="EXAMPLE_1" version="1.1"> 
    <someothernode> 
    </someothernode> 
    <metadata> 
    </metadata> 
</manifest> 

Is SimpleXML - лучший способ добавить пространства имен?

Я уже пробовал другие решения, найденные здесь, в Stack Overflow, без успеха. Я даже включил двойное определение пространства имен, например «xmlns: xmlns: namespace», но оно также не работало.

Основная проблема заключается в том, что код, который прочитал этот узел, который я создаю терпит неудачу, когда узел имеет дополнительные атрибуты (использует XPath), он должен быть чистым, как:

<namespace:nodename> 

ответ

0

Имея пространство имен, которое является не определен, документ плохо сформирован в соответствии со спецификацией XML, следовательно, он не квалифицирован как XML. И, как правило, XML-парсер, предназначенный для анализа и создания только XML.

Возможный подход, возможно, если вам действительно нужно создать XML, содержащий неопределенный префикс пространства имен, это позволить simpleXML добавлять новый элемент с объявлением пространства имен, а затем выполнять пост-обработку с использованием чего-то другого (а не XML-анализатора, а может быть, простых операций с строкой или регулярное выражение).

С другой стороны, если у вас есть контроль над XPath, вы можете быть в состоянии сделать это работает с любым пространством имен путем сопоставления элементов с использованием local-name() вместо имени-квалифицированного элемента, f.e вместо /nodename вы можете сделать /*[local-name()='nodename'].

Смежные вопросы