david-solus/reo-openimmo

重新排序的属性

v0.11.17 2022-03-29 13:28 UTC

README

Packagist Minimum PHP Version

OpenImmo及其标志是OpenImmo e.V.的注册商标。此包不是官方发行版,我也与该组织无关!

此库只是用一些PHP7/8类包装了OpenImmo XML格式。

http://www.openimmo.de/go.php/p/22/support20.htm有一个官方库可供使用,价格为95欧元(不含增值税),仅支持PHP5。为了完全说服您,您只有在付款后才能看到代码,并且他们有一个不退款的政策。

重要说明

此库是umajiis项目的分支。在这个版本中重新排序了属性。

由于许可证限制,我不得将真实世界的XML示例包含在此发行包中。因此,如果在示例目录中找不到XML文件,某些测试将自动跳过!不要被OpenImmo中的“开放”所迷惑 ;-)

用法

编写OpenImmo XML

// just create the elements you need in your xml and use the set-methods to fill in values.
$nutzungsart = new Nutzungsart();
$nutzungsart
    ->setWohnen(true)
    ->setGewerbe(false)
    ->setAnlage(false)
    ->setWaz(false);

$serializer = \JMS\Serializer\SerializerBuilder::create()->build();
echo $serializer->serialize($nutzungsart, 'xml');

将生成

<nutzungsart WOHNEN="true" GEWERBE="false" ANLAGE="false" WAZ="false" />

嵌套元素创建同样简单。类、属性、常量和参数与xsd文件中的对应项命名。它们只是转换为camelCase以符合PHP标准。

$infrastrktur = new Infrastruktur();
$infrastrktur
    ->setZulieferung(false)
    ->setAusblick((new Ausblick())->setBlick(Ausblick::BLICK_BERGE))
    ->setDistanzenSport([
        new DistanzenSport(DistanzenSport::DISTANZ_ZU_SPORT_SEE, 15)
    ])
    ->setDistanzen([
        new Distanzen(Distanzen::DISTANZ_ZU_HAUPTSCHULE, 22)
    ]);
    
$serializer = \JMS\Serializer\SerializerBuilder::create()->build();
echo $serializer->serialize($infrastrktur, 'xml');

将生成

<infrastruktur>
	<ausblick blick="BERGE" />
	<distanzen distanz_zu="HAUPTSCHULE" >22.0</distanzen>
	<distanzen_sport distanz_zu_sport="SEE" >15.0</distanzen_sport>
	<zulieferung>false</zulieferung>
</infrastruktur>

读取OpenImmo XML

将数据从xml读取到易于使用的对象结构也很简单。此示例将生成一个对象列表(地址)。

$xmlString = file_get_contents('./example/foobar.xml');
/* @var $openImmo \Ujamii\OpenImmo\API\Openimmo */
$openImmo = $serializer->deserialize($xmlString, \Ujamii\OpenImmo\API\Openimmo::class, 'xml');

/* @var $anbieter \Ujamii\OpenImmo\API\Anbieter */
foreach ($openImmo->getAnbieter() as $anbieter) {
    /* @var $immobilie \Ujamii\OpenImmo\API\Immobilie */
    foreach ($anbieter->getImmobilie() as $immobilie) {
        echo PHP_EOL . vsprintf('%s %s, %s %s', [
                $immobilie->getGeo()->getStrasse(),
                $immobilie->getGeo()->getHausnummer(),
                $immobilie->getGeo()->getPlz(),
                $immobilie->getGeo()->getOrt(),
            ]);
    }
}

编写JSON(自v0.10起)

尽管OpenImmo标准只描述了XML版本,但可能会有一些情况,您希望从给定数据生成JSON。遗憾的是,在JMS serializer中存在有关自定义类型、标量值和JSON序列化的问题(问题)。尽管如此,仍然可以使用Symfony serializer组件编写JSON格式。

composer require symfony/serializer

生成JSON的工作方式如下

use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Serializer;

$openImmoObject = null; // this may be any object of one of the API classes from this package
$encoders    = [new JsonEncoder()];
$normalizers = [
    new DateTimeNormalizer(),
    new GetSetMethodNormalizer()
];
$serializerContext = [
    AbstractObjectNormalizer::SKIP_NULL_VALUES       => true,
    AbstractObjectNormalizer::PRESERVE_EMPTY_OBJECTS => false,
    'json_encode_options'                            => \JSON_PRESERVE_ZERO_FRACTION
];

$serializer = new Serializer($normalizers, $encoders);
$jsonContent = $this->serializer->serialize($openImmoObject, JsonEncoder::FORMAT, $serializerContext);

可能的问题

DateTime格式不起作用

一些工具可能在xml中生成DateTime值,这会导致错误,如下所示

Fatal error: Uncaught JMS\Serializer\Exception\RuntimeException: Invalid datetime "2020-08-07T11:56:39.1242974+02:00", expected one of the format "Y-m-d\TH:i:sP", "Y-m-d\TH:i:s".

这可能是由该值的微秒部分(1242974)的不同精度引起的。由于默认PHP精度可能低于生成xml的工具的精度,因此如果使用您使用的数据出现此问题,您可以将包含在此包中的处理程序添加到序列化器中,如下所示

use JMS\Serializer\Handler\HandlerRegistryInterface;
use Ujamii\OpenImmo\Handler\DateTimeHandler;

$builder = \JMS\Serializer\SerializerBuilder::create();
$builder
    ->configureHandlers(function(HandlerRegistryInterface $registry) {
        $registry->registerSubscribingHandler(new DateTimeHandler());
    })
;
$serializer = $builder->build();

使用新的OpenImmo版本更新API类

  1. 安装composer包。
  2. 他们的网站下载OpenImmo文件(提取到示例文件夹)。他们的许可协议禁止重新分配xsd文件。
  3. php -f generate-api.php将填充src/API目录中的新类。
  4. 使用composer dumpautoload更新自动加载。
  5. 完成。

运行测试

  1. composer run phpunit

许可证和贡献

GPLv3

由于这是开源软件,您可以通过报告错误、改进代码、编写测试或您能做的任何其他事情来为项目做出贡献。

如果您想帮助我,请从我的Amazon愿望清单购买一些东西。

谢谢!