从模式中猜测 XML 的根元素属性
Guess XML's root element attributes from schema
我不太喜欢 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 架构以
开头
<?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 元素中,但我不知道它们是哪些。我一直在谷歌上搜索,但不知道如何去做。
有人知道我该怎么做吗?。谢谢
通过添加
xmlns="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd"
您将其指定为默认命名空间。您还可以通过添加
为命名空间使用前缀
xmlns:remit="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd"
但是你必须更改整个 xml,因为每个元素都需要以
作为前缀
remit:
虽然我自己不喜欢使用默认名称空间,因为我认为它比使用显式名称空间更令人困惑。但在这种情况下,更改整个 XML 文档并为每个元素添加前缀可能工作量太大。
您 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"/>
您也可以为命名空间使用 alias/prefix。
$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"/>
命名空间节点使用与属性节点相同的语法,但如果您使用命名空间感知方法,它们会自动添加。
简单XML有点不同。您始终必须通过加载 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 提供命名空间参数,它将使用父节点的命名空间。
我不太喜欢 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 架构以
开头<?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 元素中,但我不知道它们是哪些。我一直在谷歌上搜索,但不知道如何去做。
有人知道我该怎么做吗?。谢谢
通过添加
xmlns="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd"
您将其指定为默认命名空间。您还可以通过添加
为命名空间使用前缀xmlns:remit="http://www.acer.europa.eu/REMIT/REMITTable1_V2.xsd"
但是你必须更改整个 xml,因为每个元素都需要以
作为前缀remit:
虽然我自己不喜欢使用默认名称空间,因为我认为它比使用显式名称空间更令人困惑。但在这种情况下,更改整个 XML 文档并为每个元素添加前缀可能工作量太大。
您 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"/>
您也可以为命名空间使用 alias/prefix。
$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"/>
命名空间节点使用与属性节点相同的语法,但如果您使用命名空间感知方法,它们会自动添加。
简单XML有点不同。您始终必须通过加载 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 提供命名空间参数,它将使用父节点的命名空间。