ujamii / openimmo
PHP8 的 OpenImmo 库。使用 JMS Serializer 读取和写入 OpenImmo XML 格式。
Requires
- php: >=8.1
- ext-dom: *
- ext-simplexml: *
- doctrine/annotations: ^2.0
- jms/serializer: ^2.1 || ^3.5
Requires (Dev)
- ext-json: *
- friendsofphp/php-cs-fixer: ^3.0
- goetas-webservices/xsd-reader: ^0.4
- infection/infection: >=0.16
- nette/php-generator: ^4.0
- phpstan/phpstan: ^1.0
- phpunit/phpunit: >=7.5 <10
- rector/rector: >=0.18
- symfony/serializer: ^5.3 || ^6.0
- dev-master
- v2.1.1
- v2.1.0
- v2.0.0
- v1.0.0
- v0.10.0
- v0.9.3
- v0.9.2
- v0.9.1
- v0.9.0
- v0.8.1
- v0.8.0
- v0.7.0
- v0.6.0
- v0.5.0
- v0.4.0
- v0.3.1
- v0.3.0
- v0.2.0
- v0.1.1
- v0.1.0
- dev-dependabot/github_actions/shivammathur/setup-php-2.31.1
- dev-dependabot/github_actions/codecov/codecov-action-4.5.0
- dev-dependabot/composer/phpunit/phpunit-gte-7.5lt-11
- dev-bugfix/issue-3
This package is auto-updated.
Last update: 2024-09-24 07:22:06 UTC
README
OpenImmo 和 OpenImmo 标志是 OpenImmo e.V. 的注册商标。本包不是官方发行版,我与该组织无关!
此库只是用一些 PHP8 类包装了 OpenImmo XML 格式。如果您需要支持 PHP <= 8.1,请查看此包的 1.x 版本。版本 2 仅适用于 PHP >=8.2。
在 http://www.openimmo.de/go.php/p/22/support20.htm 处有一个官方库可用,不含增值税价格为 95 欧元,并与 "PHP5 兼容,并已在 PHP 8.1 上测试"(引号结束)。为了完全让您信服,您只能在付款后并遵守无退款政策的情况下查看代码。
重要说明
由于可能存在许可证和隐私问题,我不想将现实世界的 XML 示例包含在这个发行包中。因此,如果未在示例目录中找到 XML 文件,某些测试将自动跳过!OpenImmo 中的 "Open" 与开源无关(有人告诉我 ;-)
待办事项
- 添加测试用例,特别是官方下载包中提供的示例文件。
安装
composer req ujamii/openimmo
集成
如果您想将此 API 作为集成到 CMS 或框架的基础,请随时联系我,我会在这里链接它。
- 集成到 TYPO3 CMS,扩展 "openimmo"
- NEOS CMS,包 "Ujamii.OpenImmoNeos"
使用
编写 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 的工具的精度,因此如果使用您使用的数据出现此问题,您可以将包含在此包中的处理程序添加到 serializer 中,如下所示
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 类
- 安装 composer 包。
- 从他们的网站下载OpenImmo文件(解压到示例文件夹)。他们的许可协议禁止重新分发xsd文件。
- 使用
php -f generate-api.php
将为src/API
目录填充新类。 - 使用
composer dumpautoload
更新自动加载。 - 完成。
正在运行测试
运行
composer run phpunit
许可和贡献
由于这是一个开源项目,您可以通过报告错误、改进代码、编写测试或您能做的任何其他事情来为项目做出贡献。
如果您想帮我一个忙,请从我的亚马逊愿望清单购买一些东西。
谢谢!
- Qbus Internetagentur GmbH 对您的代码贡献表示感谢