xml2array; Werkt niet zoals hij moet werken
Ik gebruik deze functie om een XML bestand uit te lezen.
Even dit .xml bestand gebruiken als voorbeeld:
Code (php)
1
2
3
4
2
3
4
<?xml version="1.0" encoding="ISO-8859-1" ?>
<phraseset>
<phrase id="testing">Testing</phrase>
</phraseset>
<phraseset>
<phrase id="testing">Testing</phrase>
</phraseset>
Als ik 1 zin heb kan ik hem uitlezen als $xPhraseset['phraseset']['_c']['phrase'], maar als er meerdere zijn krijg je ['phrase'][0], ['phrase'][1] etc...
Ik wil dat deze altijd op die 2e manier gedaan word, maar wat ik ook aanpas, hij doet het gewoon niet :s
Weet iemand hoe ik dit oplos?
Niemand?
Hoi ToySoldier, zou je je vraag misschien kunnen verduidelijken? Evt wat code posten. Als je met arrays werkt gebruik je foreach. Je kunt een lege string aanmaken en deze doormiddel van een foreach of een while(als uit db komt) vullen en zo xml bestandje maken.
De code zelf staat al in de start post :)
Je hebt wat ik wil niet helemaal begrepen; Ik gebruik deze functie om een XML bestand uit te lezen en om te zetten in een array. Ik heb de functie echter ook maar ergens van het internet afgeplukt. Als een xml-setje (zoals in mijn voorbeeld 'phraseset') 1 element heeft dan staat dan kan je hem uitlezen als $xResultaat['phraseset']['_c']['phrase'], maar als hij meerdere resultaten heeft dan kan je hem uitlezen als $xResultaat['phraseset']['_c']['phrase'][0], $xResultaat['phraseset']['_c']['phrase'][1] etc...
Mijn bedoeling is dat hij hem altijd op die 2e manier zet, dus altijd bij $xResultaat['phraseset']['_c']['phrase'][0] begint, i.p.v. bij $xResultaat['phraseset']['_c']['phrase'].
op regel 89 staat $this->_del_p( $aMNArray );
die functie verwijdert alle ... hoe heten die dingen ook alweer..
als je nog zo'n functie maakt die
- checkt of $xResultaat['phraseset']['_c']['phrase'] een array is
- zo ja, gewoon laten voor wat-ie is
- zo nee, doe je zoeits: $xResultaat['phraseset']['_c']['phrase'][0] = $xResultaat['phraseset']['_c']['phrase'];
Hieronder heb ik even snel iets gemaakt dat zou kunnen werken:
Zoiets werkt vast wel (heb het nog niet geprobeerd) maar ik kom er niet uit waar het in de functie zelf moet staan, want ik heb als het even kan liever dat hij het in de functie direct goed zet (zodat het op verdere niveau's ook nog werkt)
*bump*
*bump2*
"(zodat het op verdere niveau's ook nog werkt)", ja stom daar had ik aan moeten denken...
wat de code betreft snap ik er nog steeds niet veel van...
omdat ik niet eerg veel weet van XML laat staan van de functies xml_parser_create(), xml_parser_set_option, xml_parse_into_struct en xml_parser_free.
Ik ga morgen (of een andere keer verder kijken)
ik geloof dat je ergens tussen regel 49 en 65 wat moet aan passen.
hieronder nog even de functie zoals ik hem nu test en probeer aan te passen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
function xml2array( $sString )
{
$xParser = xml_parser_create();
xml_parser_set_option( $xParser, XML_OPTION_CASE_FOLDING, 0 );
xml_parse_into_struct( $xParser, $sString, $aVals, $aIndex );
xml_parser_free( $xParser );
$aMNArray = array();
$aXMLArray = &$aMNArray;
foreach ( $aVals as $aRow )
{
$t = $aRow['tag'];
if ( $aRow['type'] == 'open' )
{
if ( isset( $aXMLArray[$t] ) )
{
if ( isset( $aXMLArray[$t][0] ) )
{
$aXMLArray[$t][] = array();
}
else
{
$aXMLArray[$t] = array( $aXMLArray[$t], array() );
}
$cv = &$aXMLArray[$t][count( $aXMLArray[$t] ) - 1];
}
else
{
$cv = &$aXMLArray[$t];
}
if ( isset( $aRow['attributes'] ) )
{
foreach ( $aRow['attributes'] as $k =>$v )
{
$cv['_a'][$k] = $v;
}
}
$cv['_c'] = array();
$cv['_c']['_p'] = &$aXMLArray;
$aXMLArray = &$cv['_c'];
}
elseif ( $aRow['type'] == 'complete' )
{
if ( isset( $aXMLArray[$t] ) )
{
if ( isset( $aXMLArray[$t][0] ) )
{
$aXMLArray[$t][] = array();
}
else
{
$aXMLArray[$t] = array( $aXMLArray[$t], array() );
}
$cv = &$aXMLArray[$t][count( $aXMLArray[$t] ) - 1];
}
else
{
$cv = &$aXMLArray[$t];
}
if ( isset( $aRow['attributes'] ) )
{
foreach ( $aRow['attributes'] as $k => $v )
{
$cv['_a'][$k] = $v;
}
}
$cv['_v'] = ( isset( $aRow['value'] ) ? $aRow['value'] : '' );
}
elseif ( $aRow['type'] == 'close' )
{
$aXMLArray = &$aXMLArray['_p'];
}
}
return $aMNArray;
}
$sString =
'<?xml version="1.0" encoding="ISO-8859-1" ?>
<phraseset>
<phrase id="testing">Testing</phrase>
<phrase id="testing2">testing2</phrase>
<phraseset2>
<phrase2 id="test">Test</phrase2>
</phraseset2>
</phraseset>';
print_r(xml2array($sString));
?>
function xml2array( $sString )
{
$xParser = xml_parser_create();
xml_parser_set_option( $xParser, XML_OPTION_CASE_FOLDING, 0 );
xml_parse_into_struct( $xParser, $sString, $aVals, $aIndex );
xml_parser_free( $xParser );
$aMNArray = array();
$aXMLArray = &$aMNArray;
foreach ( $aVals as $aRow )
{
$t = $aRow['tag'];
if ( $aRow['type'] == 'open' )
{
if ( isset( $aXMLArray[$t] ) )
{
if ( isset( $aXMLArray[$t][0] ) )
{
$aXMLArray[$t][] = array();
}
else
{
$aXMLArray[$t] = array( $aXMLArray[$t], array() );
}
$cv = &$aXMLArray[$t][count( $aXMLArray[$t] ) - 1];
}
else
{
$cv = &$aXMLArray[$t];
}
if ( isset( $aRow['attributes'] ) )
{
foreach ( $aRow['attributes'] as $k =>$v )
{
$cv['_a'][$k] = $v;
}
}
$cv['_c'] = array();
$cv['_c']['_p'] = &$aXMLArray;
$aXMLArray = &$cv['_c'];
}
elseif ( $aRow['type'] == 'complete' )
{
if ( isset( $aXMLArray[$t] ) )
{
if ( isset( $aXMLArray[$t][0] ) )
{
$aXMLArray[$t][] = array();
}
else
{
$aXMLArray[$t] = array( $aXMLArray[$t], array() );
}
$cv = &$aXMLArray[$t][count( $aXMLArray[$t] ) - 1];
}
else
{
$cv = &$aXMLArray[$t];
}
if ( isset( $aRow['attributes'] ) )
{
foreach ( $aRow['attributes'] as $k => $v )
{
$cv['_a'][$k] = $v;
}
}
$cv['_v'] = ( isset( $aRow['value'] ) ? $aRow['value'] : '' );
}
elseif ( $aRow['type'] == 'close' )
{
$aXMLArray = &$aXMLArray['_p'];
}
}
return $aMNArray;
}
$sString =
'<?xml version="1.0" encoding="ISO-8859-1" ?>
<phraseset>
<phrase id="testing">Testing</phrase>
<phrase id="testing2">testing2</phrase>
<phraseset2>
<phrase2 id="test">Test</phrase2>
</phraseset2>
</phraseset>';
print_r(xml2array($sString));
?>
Gewijzigd op 01/01/1970 01:00:00 door Krop Kroppyer
ik heb het niet uitgebreid getest, ik heb eigenlijk maar een keer getest met een voorbeeldje... maar als je op regel 64 hierboven "$cv = &$aXMLArray[$t][];" ipv "$cv = &$aXMLArray[$t];" zet dan lijkt het te doen wat je wilt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
XML:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<phraseset>
<phrase id="testing">Testing</phrase>
<phrase id="testing2">testing2</phrase>
<phrase id="testing3">testing3</phrase>
<phrase id="testing4">testing4</phrase>
<phraseset2>
<phrase2 id="test">Test</phrase2>
</phraseset2>
</phraseset>
resultaat xml2array():
Array
(
[phraseset] => Array
(
[_c] => Array
(
[_p] => Array
(
[phraseset] => Array
*RECURSION*
)
[phrase] => Array
(
[0] => Array
(
[_a] => Array
(
[id] => testing
)
[_v] => Testing
)
[1] => Array
(
[_a] => Array
(
[id] => testing2
)
[_v] => testing2
)
[2] => Array
(
[_a] => Array
(
[id] => testing3
)
[_v] => testing3
)
[3] => Array
(
[_a] => Array
(
[id] => testing4
)
[_v] => testing4
)
)
[phraseset2] => Array
(
[_c] => Array
(
[_p] => Array
*RECURSION*
[phrase2] => Array
(
[0] => Array
(
[_a] => Array
(
[id] => test
)
[_v] => Test
)
)
)
)
)
)
)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<phraseset>
<phrase id="testing">Testing</phrase>
<phrase id="testing2">testing2</phrase>
<phrase id="testing3">testing3</phrase>
<phrase id="testing4">testing4</phrase>
<phraseset2>
<phrase2 id="test">Test</phrase2>
</phraseset2>
</phraseset>
resultaat xml2array():
Array
(
[phraseset] => Array
(
[_c] => Array
(
[_p] => Array
(
[phraseset] => Array
*RECURSION*
)
[phrase] => Array
(
[0] => Array
(
[_a] => Array
(
[id] => testing
)
[_v] => Testing
)
[1] => Array
(
[_a] => Array
(
[id] => testing2
)
[_v] => testing2
)
[2] => Array
(
[_a] => Array
(
[id] => testing3
)
[_v] => testing3
)
[3] => Array
(
[_a] => Array
(
[id] => testing4
)
[_v] => testing4
)
)
[phraseset2] => Array
(
[_c] => Array
(
[_p] => Array
*RECURSION*
[phrase2] => Array
(
[0] => Array
(
[_a] => Array
(
[id] => test
)
[_v] => Test
)
)
)
)
)
)
)
Ik geloof dat er van regels 51-58 alleen maar regel 57 over hoeft te blijven omdat isset( $aXMLArray[$t][0] ) altijd ONWAAR is.
Die is het, perfect! En dat met 2 haakjes :D
Dankje wel :D