在 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);
?>