从架构中猜出XML的根元素属性

时间:2015-08-18 12:54:02

标签: php xml xsd

我不太热衷于XML,但我必须根据XSD文件生成并验证一些XML文件。

我创建了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 Schema以

开头
<?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元素中添加一些属性但是,我不知道它们是什么。我一直在谷歌搜索,但我无法弄清楚如何做到这一点。

有人知道我应该怎么做吗?感谢。

2 个答案:

答案 0 :(得分:2)

添加

xmlns="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd"

您将其指定为默认命名空间。您还可以通过添加

为命名空间使用前缀
xmlns:remit="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd"

但是你必须改变你的整个xml,因为每个元素都需要以

作为前缀
remit:

虽然我不想自己使用默认命名空间,但我认为使用显式命名空间会更加混乱。但在这种情况下,更改整个XML文档并将前缀添加到每个元素可能需要做太多工作。

答案 1 :(得分:2)

您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提供namespace参数,它将使用父节点的命名空间。