这是我正在使用的示例 xml:
<contact id="43956">
<personal>
<name>
<first>J</first>
<middle>J</middle>
<last>J</last>
Some text...
</name>
<title>Manager</title>
<employer>National</employer>
<dob>1971-12-22</dob>
</personal>
</contact>
我得到了,Some text...
但现在我需要我的代码来读取整个 xml 文档。它也没有读取 xml 中的值......正如你所知道的那样,我以前从未使用XMLReader
过。
这就是我得到的:
Array ( [contact] => Array ( [id] => 43956 [value] => some sample value ) [first] => [middle] => [last] => [#text] => Some text... [name] => [title] => [employer] => [dob] => [personal] => )
这是我现在拥有的代码:
function xml2array($file, array $result = array()) {
$lastElementNodeType = '';
$xml = new XMLReader();
if(!$xml->open($file)) {
die("Failed to open input file");
}
while($xml->read()) {
switch ($xml->nodeType) {
case $xml::END_ELEMENT:
$lastElementNodeType = $xml->nodeType;
case $xml::TEXT:
$tag = $xml->name;
if($lastElementNodeType == 15) {
$result[$tag] = $xml->readString();
}
case $xml::ELEMENT:
$lastElementNodeType = $xml->nodeType;
$tag = $xml->name;
if($xml->hasAttributes) {
while($xml->moveToNextAttribute()) {
$result[$tag][$xml->name] = $xml->value;
}
}
}
}
print_r($result);
}
我想过让这个函数递归,但是当我尝试这样做时,它使数组变得非常混乱。
我有一个版本,但它仍然没有输出J
,first
等等:
function xml2assoc($xml) {
$tree = null;
while($xml->read())
switch ($xml->nodeType) {
case XMLReader::END_ELEMENT: return $tree;
case XMLReader::ELEMENT:
$node = array('tag' => $xml->name, 'value' => $xml->isEmptyElement ? '' : xml2assoc($xml));
if($xml->hasAttributes)
while($xml->moveToNextAttribute())
$node['attributes'][$xml->name] = $xml->value;
$tree[] = $node;
break;
case XMLReader::TEXT:
case XMLReader::CDATA:
$tree .= $xml->value;
}
return $tree;
}