在 PHP 中将 .xsd 文件转换为数组
PHP 没有直接的函数,像转 XML 文件一样,将 .xsd(XML Schema Definition) 文件转换成相关数组。所以第一步你需要将 .xsd 文件转换为 xml,然后最后成关联数组解析 xml 文件。下面是几个简单的步骤,将.xsd 文件转换成关联数组。下面先使用 PHP 自带的DOMDocument 操作文档,如果你的 PHP 没有开启 DOM 扩展,你要先去安装相应的扩展,然后在 php.ini 配置文件中启动扩展才能使用 DOMDocument 类。
步骤1:加载 .xsd 文件
<?php //创建文档实例 $doc = new DOMDocument(); $doc->preserveWhiteSpace = true; $doc->load('yourfile.xsd'); ?>
步骤2:将 .xsd 文件保存为一个 xml 文件
<?php $doc->save('myxml.xml'); ?>
步骤3:将 xml 内容保存为字符串并删除 xsd 前缀。
<?php $myxmlfile = file_get_contents('myxml.xml'); $parseObj = str_replace($doc->lastChild->prefix.':',"",$myxmlfile); ?>
最后 将 .xsd 文件转换到 xml 文件中,现在我们使用 PHP 的 simplexml_load_string 函数获取数组。
<?php $xml_string= simplexml_load_string($parseObj); $json = json_encode($ob); $data = json_decode($json, true); print_r($data); ?>
备注:在 stackoverflow 上看到有人提问,摘抄了回答者的代码,仅供参考:
提问者:我需要使用 PHP 将.xsd 文件转换成 数组。我要从用户端动态的获取 xsd 文件,然后用 PHP 对这些内容生成数组。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
回答者1:
<?php $attributes = array(); $xsdstring = "yourfile.xsd"; $XSDDOC = new DOMDocument(); $XSDDOC->preserveWhiteSpace = false; if ($XSDDOC->load($xsdstring)) { $xsdpath = new DOMXPath($XSDDOC); $attributeNodes = $xsdpath-> query('//xs:simpleType[@name="attributeType"]') ->item(0); foreach ($attributeNodes->childNodes as $attr) { $attributes[ $attr->getAttribute('value') ] = $attr->getAttribute('name'); } unset($xsdpath); } print_r($attributes); ?>