在PHP中将XSD模板转换为XML实例

时间:2011-02-02 18:31:36

标签: php xml xsd

我有一个XSD文件,我需要从该XSD文件生成一个有效的示例XML。 例如,给定以下XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Address">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Recipient" type="xs:string" default="John Doe" />
        <xs:element name="Street" type="xs:string" />
        <xs:element name="age" type="xs:integer"/>
        <xs:element name="dateborn" type="xs:date"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

生成以下XML:

<xml>
    <Address>
        <Recipient>John Doe</Recipient>
        <Street></Street>
        <age>43</age>
        <dateborn>1970-03-27</dateborn>
    </Address>
</xml>

我已经在PHP中搜索了能够执行此操作的解决方案,但只是遇到了两种可能的解决方案,但没有成功。

  1. 使用SDO_DAS_XML。但是,这取决于php_sdo.dll的可用性,似乎没有一个版本可以在Windows上实际运行。

  2. 第二次尝试是看github.com/moyarada/XSD-to-PHP或 forums.devshed.com/php-development-5/xml-schema-binding-to-php-code-jaxb-equivalent-199799.html 但是,这些目标是解析XSD并转换为PHP类,并且似乎不是将任何XSD转换为简单干净的XML(如上所述)的通用命令。

  3. 非常感谢任何想法或解决方案:)

    谢谢!

3 个答案:

答案 0 :(得分:1)

我发现执行此任务的唯一合理方法是将XSD视为任何XML,使用DOMDocument来解析它并从中构建专门的XML实例。

  • 此方法假定您的XSD将始终具有相同的结构,只有不同的字段名称,并且您对一个非常简单的XML实例形式感兴趣,这意味着节点,仅此而已。
  • 该方法的好处在于灵活性,只需编辑foreach循环即可修改您的特殊结构。
//Build the template from the schema:
$schema = new DOMDocument();
$schema->loadXML($schemaXSDFile); //that is a String holding your XSD file contents
$fieldsList = $schema->getElementsByTagName('element'); //get all elements 
$metadataTemplate = '';
foreach ($fieldsList as $element) {
    //add any special if statements here and modify the below to include any attributes needed
    $key = $element->getAttribute('name');
    $metadataTemplate .= '<' . $key . '>' . '</' . $key . '>';
}

//Manipulate the template adding your fields values:
$metadataXml = simplexml_load_string($metadataTemplate);
$metadataXml->fieldName = 'value';

答案 1 :(得分:1)

我偶然发现了你寻求解决方案,因为我自己需要一个解决方案。

对于寻求解决方案的每个人:

找到XSD2PHP Original并分叉以更好地满足我的需求Updated Version

答案 2 :(得分:0)

我在PHP中找不到任何内容,但我遇到了这个问题 - http://sourceforge.net/projects/camprocessor/

它在JAVA中,但作为它的开源,你可以尝试从给定的XSD中找到用于生成XML样本的精确java类。之后,同一个类的逻辑可以在PHP中实现。

可能听起来不切实际,但这是关闭的我可以得到! :|