goetas/xsd2php

此包已废弃,不再维护。作者建议使用goetas-webservices/xsd2php包。

将XSD(XML模式)定义转换为PHP类

2.1.0 2016-08-03 14:50 UTC

README

此存储库已废弃,请使用 goetas-webservices/xsd2php

Build Status Code Coverage Scrutinizer Code Quality

将XSD转换为PHP类。

使用 goetas/xsd2php,您可以将任何XSD/WSDL定义转换为PHP类。

XSD2PHP还可以生成与JMS Serializer兼容的元数据,可用于序列化/反序列化对象实例.

安装

推荐通过 Composer 安装 xsd2php

  • 将依赖项添加到您的 composer.json 文件中
  "require-dev": {
      ..
      "goetas/xsd2php":"^2.1",
      ..
  }

用法

通过此示例,我们将将OTA XSD定义转换为PHP类。

假设您在 /home/my/ota 中有所有XSD文件。

生成PHP类

vendor/bin/xsd2php convert:php \
`/home/my/ota/OTA_HotelAvail*.xsd \

--ns-map='http://www.opentravel.org/OTA/2003/05;Mercurio/OTA/2007B/' \

--ns-dest='Mercurio/OTA/2007B/;src/Mercurio/OTA/V2007B' \

--alias-map='http://www.opentravel.org/OTA/2003/05;CustomOTADateTimeFormat;Vendor/Project/CustomDateClass'

命名空间怎么办?

  • http://www.opentravel.org/OTA/2003/05 将转换为 Mercurio/OTA/2007B PHP命名空间

文件放在哪里?

  • Mercurio/OTA/2007B 类将被放置在 src/Mercurio/OTA/V2007B 目录中

自定义类型怎么办?

  • --alias-map='http://www.opentravel.org/OTA/2003/05;CustomOTADateTimeFormat;Vendor/Project/CustomDateClass' 将指示 XSD2PHP 不要在 http://www.opentravel.org/OTA/2003/05 命名空间内为 CustomOTADateTimeFormat 类型生成任何类。所有对此类型的引用都将替换为 Vendor/Project/CustomDateClass 类。

使用Composer脚本生成类

  "scripts": {
    "build": "xsd2php convert:php '/home/my/ota/OTA_HotelAvail*.xsd' --ns-map='http://www.opentravel.org/OTA/2003/05;Mercurio/OTA/2007B/' --ns-dest='Mercurio/OTA/2007B/;src/Mercurio/OTA/V2007B'"
  }

现在您可以使用 composer build 构建您的类。

序列化/反序列化

XSD2PHP还可以为您生成JMS Serializer元数据,您可以使用它来序列化/反序列化生成的PHP类实例。

vendor/bin/xsd2php  convert:jms-yaml \
`/home/my/ota/OTA_HotelAvail*.xsd \

--ns-map='http://www.opentravel.org/OTA/2003/05;Mercurio/OTA/2007B/'  \
--ns-dest='Mercurio/OTA/2007B/;src/Metadata/JMS;' \

--alias-map='http://www.opentravel.org/OTA/2003/05;CustomOTADateTimeFormat;Vendor/Project/CustomDateClass'

命名空间怎么办?

  • http://www.opentravel.org/OTA/2003/05 将转换为 Mercurio/OTA/2007B PHP命名空间

文件放在哪里?

  • http://www.opentravel.org/OTA/2003/05 将放置在 src/Metadata/JMS 目录中

自定义类型怎么办?

  • --alias-map='http://www.opentravel.org/OTA/2003/05;CustomOTADateTimeFormat;Vendor/Project/CustomDateClass' 将指示 XSD2PHP 不要在 http://www.opentravel.org/OTA/2003/05 命名空间内为 CustomOTADateTimeFormat 类型生成任何元数据信息。所有对此类型的引用都将替换为 Vendor/Project/CustomDateClass 类。您必须为此类型提供一个 自定义序列化器

  • 添加xsd2php依赖项以满足BaseTypesHandler和XmlSchemaDateHandler。

"require" : {
    "goetas-webservices/xsd2php-runtime":"^0.2.2",
}
use JMS\Serializer\SerializerBuilder;
use JMS\Serializer\Handler\HandlerRegistryInterface;

use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\BaseTypesHandler;
use GoetasWebservices\Xsd\XsdToPhpRuntime\Jms\Handler\XmlSchemaDateHandler;

$serializerBuilder = SerializerBuilder::create();
$serializerBuilder->addMetadataDir('metadata dir', 'DemoNs');
$serializerBuilder->configureHandlers(function (HandlerRegistryInterface $handler) use ($serializerBuilder) {
    $serializerBuilder->addDefaultHandlers();
    $handler->registerSubscribingHandler(new BaseTypesHandler()); // XMLSchema List handling
    $handler->registerSubscribingHandler(new XmlSchemaDateHandler()); // XMLSchema date handling

    // $handler->registerSubscribingHandler(new YourhandlerHere());
});

$serializer = $serializerBuilder->build();

// deserialize the XML into Demo\MyObject object
$object = $serializer->deserialize('<some xml/>', 'DemoNs\MyObject', 'xml');

// some code ....

// serialize the Demo\MyObject back into XML
$newXml = $serializer->serialize($object, 'xml');

处理 xsd:anyTypexsd:anySimpleType

如果您的XSD包含 xsd:anyTypexsd:anySimpleType 类型,您必须指定一个处理器。

在生成JMS元数据时,您必须指定一个自定义处理器

bin/xsd2php.php convert:jms-yaml \

 ... various params ... \

--alias-map='http://www.w3.org/2001/XMLSchema;anyType;MyCustomAnyTypeHandler' \
--alias-map='http://www.w3.org/2001/XMLSchema;anyType;MyCustomAnySimpleTypeHandler' \

现在您必须创建一个自定义序列化处理器

use JMS\Serializer\XmlSerializationVisitor;
use JMS\Serializer\XmlDeserializationVisitor;

use JMS\Serializer\Handler\SubscribingHandlerInterface;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\VisitorInterface;
use JMS\Serializer\Context;

class MyHandler implements SubscribingHandlerInterface
{
    public static function getSubscribingMethods()
    {
        return array(
            array(
                'direction' => GraphNavigator::DIRECTION_DESERIALIZATION,
                'format' => 'xml',
                'type' => 'MyCustomAnyTypeHandler',
                'method' => 'deserializeAnyType'
            ),
            array(
                'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
                'format' => 'xml',
                'type' => 'MyCustomAnyTypeHandler',
                'method' => 'serializeAnyType'
            )
        );
    }

    public function serializeAnyType(XmlSerializationVisitor $visitor, $data, array $type, Context $context)
    {
        // serialize your object here
    }

    public function deserializeAnyType(XmlDeserializationVisitor $visitor, $data, array $type)
    {
        // deserialize your object here
    }
}

命名策略

命名策略有两种类型:。默认为 ,但这种命名策略可能会产生命名冲突。

命名策略将在元素后缀为 Element,类型后缀为 Type

  • MyNamespace\User 将变为 MyNamespace\UserElement
  • MyNamespace\UserType 将变为 MyNamespace\UserTypeType

例如,一个具有名为 User 的类型、名为 UserType 的类型、根元素名为 UserUserElement 的 XSD,只有在使用 命名策略时才能正常工作。

  • 如果没有命名冲突且想要有简短且描述性的类名,请使用 --naming-strategy=short 选项。
  • 如果有命名冲突,请使用 --naming-strategy=long 选项。
  • 为了安全起见,请使用 --naming-strategy=long 选项。

注意

本项目的代码在 MIT 许可下提供。如需专业支持,请联系 goetas@gmail.com 或访问 https://www.goetas.com