pdeans/xml-builder

一个简单轻量级的库,使生成XML变得轻松。

v1.0.3 2023-06-03 18:56 UTC

This package is auto-updated.

Last update: 2024-09-03 23:28:21 UTC


README

一个简单轻量级的库,使生成XML变得轻松。

安装

通过Composer安装。

$ composer require pdeans/xml-builder

用法

XML构建库扩展了PHP的XMLWriter扩展。所有XMLWriter面向对象API属性和方法都对每个XML构建实例可用。

首先,实例化一个新的XML构建类对象

use pdeans\Builders\XmlBuilder;

$bulder = new XmlBuilder;

使用create方法来生成一个xml标签。create方法将根元素名称作为第一个参数,将包含用于构建根属性元素和/或子元素的关联数组作为第二个参数。

以下是一个简单的例子

$xml = $builder->create('Category_Add', [
    '@tags' => [
        'Code' => 'Tools',
        'Name' => $builder->cdata('Class Tools and Skill Kits'),
    ],
]);

这将生成以下xml

<Category_Add>
    <Code>Tools</Code>
    <Name><![CDATA[Class Tools and Skill Kits]]></Name>
</Category_Add>

父/子元素

注意上述示例中@tags数组下的键值如何工作。键代表xml元素名称,值代表xml元素值。子标签也可以按照此模式嵌套,父元素由数组键表示,数组值由子元素的键值对组成的数组。

元素值助手

可以使用cdata助手方法将元素值包装在<![CDATA[]]>标签中,而可以使用decimal助手方法将十进制数格式化为标准十进制格式,默认情况下四舍五入到两位小数并删除逗号。decimal助手方法接受一个可选的第二个参数来设置精度。

// Output: <![CDATA[Class Tools and Skill Kits]]>
echo $builder->cdata('Class Tools and Skill Kits');

// Output: 49.00
echo $builder->decimal(49.0000000);

// Output: 49.001
echo $builder->decimal(49.0005, 3);

保留键

@tags键代表xml构建器使用的3个保留键之一(每个都包含快捷键对应项)之一,用于解析和生成xml。保留键如下

@attributes
快捷键:@a

@attributes键用于创建xml元素属性。@a键也支持作为@attributes键的快捷键。

示例

$xml = $builder->create('CategoryProduct_Assign', [
    '@attributes' => [
        'category_code' => 'Food',
        'product_code'  => 'ale-gallon',
    ],
]);

$xml = $builder->create('CategoryProduct_Assign', [
    '@a' => [
        'category_code' => 'Food',
        'product_code'  => 'ale-gallon',
    ],
]);

生成的XML

<CategoryProduct_Assign category_code="Food" product_code="ale-gallon"/>

@tags
快捷键:@t

@tags键接受一个关联数组,其中包含构建根元素子元素所需的数据。@t键也支持作为@tags键的快捷键。

示例

$xml = $builder->create('ProductAttribute_Add', [
    '@a' => [
        'product_code' => 'chest',
    ],
    '@tags' => [
        'Code'   => 'lock',
        'Type'   => 'select',
        'Prompt' => $builder->cdata('Lock'),
    ],
]);

$xml = $builder->create('ProductAttribute_Add', [
    '@a' => [
        'product_code' => 'chest',
    ],
    '@t' => [
        'Code'   => 'lock',
        'Type'   => 'select',
        'Prompt' => $builder->cdata('Lock'),
    ],
]);

生成的XML

<ProductAttribute_Add product_code="chest">
    <Code>lock</Code>
    <Type>select</Type>
    <Prompt><![CDATA[Lock]]></Prompt>
</ProductAttribute_Add>

@value
快捷键:@v

@value键明确设置xml元素值。通常,这仅在需要设置属性和值的xml元素上才需要。@v键也支持作为@value键的快捷键。

示例

$xml = $builder->create('Module', [
    '@attributes' => [
        'code' => 'customfields',
        'feature' => 'fields_prod',
    ],
    '@tags' => [
        'ProductField_Value' => [
            '@attributes' => [
                'product' => 'chest',
                'field' => 'armor_type',
            ],
            '@value' => 'wood',
        ],
    ],
]);

$xml = $builder->create('Module', [
    '@a' => [
        'code' => 'customfields',
        'feature' => 'fields_prod',
    ],
    '@t' => [
        'ProductField_Value' => [
            '@a' => [
                'product' => 'chest',
                'field' => 'armor_type',
            ],
            '@v' => 'wood',
        ],
    ],
]);

生成的XML

<Module code="customfields" feature="fields_prod">
    <ProductField_Value product="chest" field="armor_type">wood</ProductField_Value>
</Module>

请注意,@tags键仅在标签数据的关联数组的第一级上使用,因为它表示子标签数据,而其他两个保留键可以在关联数组的任何子级别上使用。

重复标签

有时在xml中使用重复标签,这不与关联数组键值对很好地配合。为了解决这个问题,仍然将元素名称作为数组键传递,但是数组值由包含标签数据的数组组成的数组。

$xml = $builder->create('Order_Add', [
    '@t' => [
        'Charges' => [
            'Charge' => [
                [
                    'Type' => 'SHIPPING',
                    'Description' => 'Shipping: UPS Ground',
                    'Amount' => 5.95
                ],
                [
                    'Type' => 'TAX',
                    'Description' => 'Sales Tax',
                    'Amount' => 2.15
                ],
            ],
        ],
    ],
]);

生成的XML

<Order_Add>
    <Charges>
        <Charge>
            <Type>SHIPPING</Type>
            <Description>Shipping: UPS Ground</Description>
            <Amount>5.95</Amount>
        </Charge>
        <Charge>
            <Type>TAX</Type>
            <Description>Sales Tax</Description>
            <Amount>2.15</Amount>
        </Charge>
    </Charges>
</Order_Add>

自闭合标签

要生成一个没有属性的自动闭合元素,请将数组值传递为空值(null)

$xml = $builder->create('Order_Add', [
    '@t' => [
        'TriggerFulfillmentModules' => null,
    ],
]);

生成的XML

<Order_Add>
    <TriggerFulfillmentModules />
</Order_Add>