Ошибка при добавлении пространства имен атрибута xmlns к корневому элементу - PullRequest
2 голосов
/ 15 февраля 2012

У меня есть xml с именем sample.xml

<?xml version="1.0"?>
<note>
         <to>Tove</to>
          <from>Jani</from>
          <heading>Reminder</heading>
          <body>Don't forget me this weekend!</body>
</note> 

и sample.xsd для проверки sample.xml

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">

         <xs:element name="note">
                  <xs:complexType>
                           <xs:sequence>
                                    <xs:element name="to" type="xs:string"/>
                                    <xs:element name="from" type="xs:string"/>
                                    <xs:element name="heading" type="xs:string"/>
                                    <xs:element name="body" type="xs:string"/>
                           </xs:sequence>
                  </xs:complexType>
         </xs:element>

</xs:schema> 

Я пытаюсь проверить sample.xml через мой php-код, и поскольку в sample.xml нет пространств имен, я добавляю пространство имен из кода php.

<?php

error_reporting(E_ALL);
ini_set('display_errors', 'On');

$file = 'sample.xml';
$schema = 'sample.xsd';
$doc = new DOMDocument();
$doc->load($file);

$doc->createAttributeNS('http://www.w3schools.com', 'xmlns');
$doc->createAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'xmlns:xsi');
$doc->createAttributeNS('http://www.w3schools.com sample.xsd', 'xsi:schemaLocation');

print $doc->saveXML();


if ($doc->schemaValidate($schema)) {
         print "$file is valid.\n";
} else {
         print "$file is invalid.\n";
}
?>

и когда я запускаю код, я получаю следующую ошибку

Неустранимая ошибка: необработанное исключение «DOMException» с сообщением «Пространство имен Ошибка »в /var/www/xsd/test_sample.php:20 трассировке стека: # 0 /var/www/xsd/test_sample.php(20): DOMDocument-> createAttributeNS ('http://www.w3.o. ..', 'xmlns: xsi') # 1 {main} добавляется в /var/www/xsd/test_sample.php в строку 20

если я закомментирую строку $doc->createAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'xmlns:xsi'); код будет работать нормально, но тогда я не смогу проверить xml, как говорится sample.xml is invalid

Может кто-нибудь помочь мне с этим кодом?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Первое, что я бы исправил, было бы также использовать appendChild в элементе документа .Без этого атрибут создается, но не добавляется к вашему дереву.

Для проверки, пожалуйста, посмотрите на эту ссылку .

1 голос
/ 26 сентября 2014

Уточнение по поводу путаницы Searock по поводу того, почему необходимо использовать appendChild при использовании createAttribute, а не при использовании createAttributeNS.

Внутренняя функциональность двух функций разработана по-разному, даже если они названы одинаково:

createAttributeNS () автоматически добавляет атрибут NameSpace к документу.

createAttribute () должен быть добавлен с appendChild ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...