2017-12-04 6 views
0

Ich arbeite mit phpunit und Laden von Daten durch Fixtures, jetzt in einem Szenario Ich habe eine Spalte in meiner Tabelle, die nur XML-Daten akzeptiert, aber ich bin nicht in der Lage, Xml-Daten zu übergeben via Feld in Fixtures Datei.Laden xml Feld in eine Fixture xml Datei (phpunit)

Was ich versucht habe:

<?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> 

Ich bin nicht in der Lage Feld "xml_order" Daten in dB zu laden. Versucht nach Lösungen Ausschau zu halten, konnte es aber nicht. Kann mir jemand dabei helfen? Ich will es in diesem xml nur in der Datei mein Test nicht laden

+0

könnten Sie klären „... Ich habe eine Spalte in meiner Tabelle, die nur XML-Daten akzeptiert ...“, bitte? Verwenden Sie eine bestimmte Art von [xml-db] (https://en.wikipedia.org/wiki/XML_database)? – xmike

+0

@xmike Sorry, was ich sagen wollte war, dass die Spalte ein Textfeld ist und ich nur XML-Daten in dieser Spalte speichern muss –

Antwort

1

Seit <Attributes/> regelmäßig xml in der XML-Befestigungsdatei ist, wenn DBUnit liest er es tut

// 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; 

und es ist Textwert ein Zeichenfolge aus Leerzeichen. Eigentlich ist das von Natur aus nur normal für xml. Um dies zu überwinden Sie in CDATA alle xml Sachen wickeln können, die Sie als Zeichenfolge während Wert Extraktion selbst behandelt werden möchten:

<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> 

Bitte beachten Sie auch, dass die tatsächlichen String noch ein paar ganz Plätze haben und neue Zeilen vor und nach dem tatsächliche XML-Zeichenfolge. Ich dies nicht aus irgendwelchen Gründen wollten Sie tun könnten:

<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> 

nicht schön aussieht, aber, aber geben Sie keine Leerzeichen vor oder nach.

Als Alternative könnte man bedenkt, array based dataset mit:

// 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>'], 
    ] 
]);