Я не очень заинтересован в XML, но я должен сгенерировать и проверить некоторые XML-файлы в соответствии с XSD-файлом.
Я создал XML-файл, но он не проходит проверку, потому что я не знаю, как получить пространство имен или что-то подобное.
Мой XML-файл похож на
<?xml version="1.0" encoding="utf-8"?>
<REMITTable1>
<reportingEntityID>CB8899899, ACE</reportingEntityID>
<contractList>
<contract>
<contractId>78</contractId>
<contractName>Nombre asignado al contrato1</contractName>
<contractType>CO</contractType>
<energyCommodity>NG</energyCommodity>
<fixingIndex>
<indexName/>
<indexValue>2.3</indexValue>
...
...
И моя схема xsd начинается с
<?xml version="1.0" encoding="utf-8"?>
<!-- edited with XMLSpy v2014 rel. 2 sp1 (x64) (http://www.altova.com) by - - (Agency for the Cooperation of Energy Regulators) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ait1="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd" targetNamespace="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd" elementFormDefault="qualified">
<xs:element name="REMITTable1">
<xs:complexType>
<xs:sequence>
<xs:element name="reportingEntityID" type="ait1:reportingEntityID">
<xs:annotation>
<xs:documentation>Field No. 6, 7</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="contractList" type="ait1:contractListType" minOccurs="0"/>
<xs:element name="OrderList" type="ait1:OrderListType" minOccurs="0">
<xs:unique name="OrderRecordSeqNumber">
<xs:selector xpath="ait1:OrderReport"/>
<xs:field xpath="ait1:RecordSeqNumber"/>
</xs:unique>
</xs:element>
Я знаю, что есть некоторые атрибуты, которые я должен добавить в элемент REMITTable1, но я не знаю, какие они есть. Я гуглил, но не могу понять, как это сделать.
Кто-нибудь знает, как мне это сделать? Благодарю.
Ваш XSD определяет целевое пространство имен, поэтому вам нужно создать XML, содержащий узлы с этим пространством имен.
В DOM вам придется использовать DOMDocument::createElementNS()
:
$document = new DOMDocument();
$document->appendChild(
$document->createElementNS(
'http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd',
'REMITTable1'
)
);
echo $document->saveXml();
Выход:
<?xml version="1.0"?>
<REMITTable1 xmlns="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd"/>
Вы также можете использовать псевдоним / префикс для пространства имен.
$document = new DOMDocument();
$document->appendChild(
$document->createElementNS(
'http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd',
'ait1:REMITTable1'
)
);
echo $document->saveXml();
Выход:
<?xml version="1.0"?>
<ait1:REMITTable1 xmlns:ait1="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd"/>
Узлы пространства имен используют тот же синтаксис, что и узлы атрибутов, но они добавляются автоматически, если вы используете методы с поддержкой пространства имен.
SimpleXML немного отличается. Вы всегда должны создавать элемент документа, загружая XML.
$element = new SimpleXmlElement(
'<REMITTable1 xmlns="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd"/>'
);
$element->addChild('contractList', null, 'http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd');
echo $element->saveXml();
Выход:
<?xml version="1.0"?>
<REMITTable1 xmlns="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd"><contractList/></REMITTable1>
Если вы не предоставите аргумент пространства имен для SimpleXmlElement, он будет использовать пространство имен родительского узла.
Добавляя
xmlns="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd"
Вы указываете это в качестве пространства имен по умолчанию. Вы также можете использовать префикс для пространства имен, добавив
xmlns:remit="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd"
Но тогда вам придется изменить весь XML-файл, поскольку каждый элемент должен иметь префикс
remit:
Хотя я сам не люблю использовать пространство имен по умолчанию, так как думаю, что это более запутанно, чем иметь явное пространство имен. Но в этом случае может быть слишком много работы, чтобы изменить весь документ XML и добавить префикс к каждому элементу.