加载夹具 xml 文件中的 xml 字段 (phpunit)
loading xml field in a fixture xml file (phpunit)
我正在使用 phpunit 并通过固定装置加载数据,现在在一种情况下,我的 table 中有一列仅接受 xml 数据,但我无法传递任何 xml 通过 fixtures 文件中的字段获取数据。
我尝试过的:
<?xml version="1.0"?>
<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<database name="phpunit">
<table_data name="testtable">
<row>
<field name="name">My Test</field>
<field name="active">1</field>
<field name="xml_order">
<Attributes>
<Attribute>
<Option Value="A">A1</Option>
<Option Value="B">B1</Option>
<Option Value="C">C1</Option>
</Attribute>
</Attributes>
</field>
</row>
</table_data>
</database>
我无法将字段 "xml_order" 数据加载到 dB。尝试寻找解决方案但无法找到。谁能帮我解决这个问题?我只想在这个 xml 中加载它,而不是在我的测试文件中
因为 <Attributes/>
是 xml fixture 文件中的常规 xml,当 dbunit 读取它时它会
// a bit simplified
// please visit https://github.com/sebastianbergmann/dbunit/blob/master/src/DataSet/MysqlXmlDataSet.php to get more details
$column = $rowElement->xpath('./field[@name="' . $columnName . '"]');
$columnValue = (string) $column;
它的文本值是一串空 space 字符。实际上,这对于 xml 来说是正常的。为了克服这个问题,你可以在 CDATA
中包装所有 xml 你希望在值提取期间被视为字符串的东西:
<field name="xml_order">
<![CDATA[
<Attributes>
<Attribute>
<Option Value="A">A1</Option>
<Option Value="B">B1</Option>
<Option Value="C">C1</Option>
</Attribute>
</Attributes>
]]>
</field>
另请注意,实际字符串在实际 xml 字符串前后仍有大量 space 和换行符。由于某些原因,我不希望这样做:
<field name="xml_order"><![CDATA[<Attributes>
<Attribute>
<Option Value="A">A1</Option>
<Option Value="B">B1</Option>
<Option Value="C">C1</Option>
</Attribute>
</Attributes>]]></field>
虽然看起来不太好,但不会给你之前或之后的 spaces。
作为替代方案,您可以考虑使用 array based dataset:
// or it could be \PHPUnit_Extensions_Database_DataSet_ArrayDataSet
// depending on the dbunit version you use
return new PHPUnit\DbUnit\DataSet\ArrayDataSet([
'testtable' => [
["name" => "MyTest", "active" => 1, "xml_order" => '<what><ever>xml</ever></what>'],
]
]);
我正在使用 phpunit 并通过固定装置加载数据,现在在一种情况下,我的 table 中有一列仅接受 xml 数据,但我无法传递任何 xml 通过 fixtures 文件中的字段获取数据。
我尝试过的:
<?xml version="1.0"?>
<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<database name="phpunit">
<table_data name="testtable">
<row>
<field name="name">My Test</field>
<field name="active">1</field>
<field name="xml_order">
<Attributes>
<Attribute>
<Option Value="A">A1</Option>
<Option Value="B">B1</Option>
<Option Value="C">C1</Option>
</Attribute>
</Attributes>
</field>
</row>
</table_data>
</database>
我无法将字段 "xml_order" 数据加载到 dB。尝试寻找解决方案但无法找到。谁能帮我解决这个问题?我只想在这个 xml 中加载它,而不是在我的测试文件中
因为 <Attributes/>
是 xml fixture 文件中的常规 xml,当 dbunit 读取它时它会
// a bit simplified
// please visit https://github.com/sebastianbergmann/dbunit/blob/master/src/DataSet/MysqlXmlDataSet.php to get more details
$column = $rowElement->xpath('./field[@name="' . $columnName . '"]');
$columnValue = (string) $column;
它的文本值是一串空 space 字符。实际上,这对于 xml 来说是正常的。为了克服这个问题,你可以在 CDATA
中包装所有 xml 你希望在值提取期间被视为字符串的东西:
<field name="xml_order">
<![CDATA[
<Attributes>
<Attribute>
<Option Value="A">A1</Option>
<Option Value="B">B1</Option>
<Option Value="C">C1</Option>
</Attribute>
</Attributes>
]]>
</field>
另请注意,实际字符串在实际 xml 字符串前后仍有大量 space 和换行符。由于某些原因,我不希望这样做:
<field name="xml_order"><![CDATA[<Attributes>
<Attribute>
<Option Value="A">A1</Option>
<Option Value="B">B1</Option>
<Option Value="C">C1</Option>
</Attribute>
</Attributes>]]></field>
虽然看起来不太好,但不会给你之前或之后的 spaces。
作为替代方案,您可以考虑使用 array based dataset:
// or it could be \PHPUnit_Extensions_Database_DataSet_ArrayDataSet
// depending on the dbunit version you use
return new PHPUnit\DbUnit\DataSet\ArrayDataSet([
'testtable' => [
["name" => "MyTest", "active" => 1, "xml_order" => '<what><ever>xml</ever></what>'],
]
]);