Создание XML в simplexml (php)

Я попытался создать файл XML, используя приведенный ниже код.

$xml = new SimpleXMLElement('<xml />');
while($rs = db_fetch_object($d_res)){
 $cmp = $xml->addChild('Company');
 $cmp->addChild('ID', $rs->nid);
 $cmp->addChild('Name', trim($rs->title));
 $cmp->addChild('Created', $rs->created);
 $cmp->addChild('Updated', $rs->changed);
}
header("Content-type: text/xml;charset=utf-8;");
print($xml->asXML());

Но когда я пытаюсь проверить это, я получаю предупреждения ниже

  1. DOCTYPE не найден! Проверка только синтаксиса XML.
  2. Кодировка символов не объявлена ​​на уровне документа.

Как их очистить? XML находится здесь, а используемый валидатор — validator.w3.org.


person Satya    schedule 13.01.2011    source источник


Ответы (5)


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

Первое сообщение указывает на то, что файл xml не указывает ни одного DTD; второй относится к тому факту, что директива xml не содержит атрибута кодировки.

К сожалению, глядя на simplexml API, не похоже, что его можно добавить (хотя я мог что-то упустить, не будучи знаком с ним). Я предполагаю, что будучи «простым», он идеально подходит для быстрого чтения XML-файла, но не для создания XML. Возможно, вам придется обратиться к чему-то более «тяжелому», например XML_Serializer.

person Sébastien Le Callonnec    schedule 13.01.2011
comment
Я бы предложил использовать обычный пакет, например DOM или XMLWriter. - person Gordon; 13.01.2011

Вы можете решить игнорировать эти предупреждения. В XML не требуется ни DOCTYPE, ни объявленная кодировка символов. На самом деле большинство XML-документов не содержат DOCTYPE.

DOCTYPE используется для проверки документа, что означает, что существует формальное описание того, какие элементы и атрибуты могут существовать для вашего документа, и может быть сделана проверка того, что ваш документ не содержит ничего другого (в этом случае он станет недействительным). Если вы не заботитесь об этом и не готовы разрабатывать, размещать и поддерживать свою собственную спецификацию DOCTYPE, игнорируйте предупреждение.

Большую часть времени создатели и потребители XML заботятся о правильном формате, что означает, что документ соответствует правилам того, как должен выглядеть XML (нет перекрестно вложенных тегов, все теги должны быть закрыты). , правильно экранированное содержимое). В противном случае ваш документ просто сломается, но здесь это не так.

Предупреждение о кодировке символов исправлено путем включения XML-объявления в верхней части документа, обозначающего кодировку:

<?xml version="1.0" encoding="utf-8" ?>

Если вы не включите его, XML по умолчанию будет «версия 1.0» и «utf-8». Если это то, что вы доставляете в любом случае, все хорошо. Если вы доставляете что-то еще, необходимо включить эту информацию.

person Tomalak    schedule 13.01.2011

Вы можете просто создать корневой элемент XML следующим образом:

$rootXml = new SimpleXMLElement("<!DOCTYPE your_root_xml_element SYSTEM 'URL_TO_DTD_SCHEME'><your_root_xml_element></your_root_xml_element>");
....
echo $rootXml->asXML();

Таким образом вы получите следующий действительный XML:

<?xml version="1.0"?>
<!DOCTYPE your_root_xml_element SYSTEM "URL_TO_DTD_SCHEME">
<your_root_xml_element>
</your_root_xml_element>
person sparkle    schedule 27.01.2012

`$xmlstr = '<?xml version="1.0" encoding="utf-8"?>
<root>
<Data>
    <Id>0475109067</Id>
    <Contact>
        <Name>Daya</Name>
        <FirstName>Star</FirstName>
        <Email>[email protected]</Email>
    </Contact>
</Data>
<Result>
    <Name></Name>
</Result>
</root>';

$xml = new SimpleXMLElement($xmlstr); 
$xml->Result->Name = 'Xmltestfile'; 
$xml->asXML('test.xml');
$xml->asXML();`

Этот код создаст xml-файл с именем test

person Daya    schedule 01.08.2012

person    schedule
comment
$xml = new SimpleXMLElement('‹?xml version=1.0 encoding=utf-8?› ‹xml /›'); - person Sarwar Erfan; 13.01.2011
comment
‹?xml version=1.0 encoding=utf-8?› :: это декларация... (Шакти Сингх пропустил вопросительные знаки) ||| затем ‹xml /› :: это корневой тег документа (хотя необычно иметь корневой тег с именем xml, но это разрешено. - person Sarwar Erfan; 13.01.2011