PHP 是一种非常强大的编程语言,用于 web 开发中获取和处理数据。XML 是一种标记语言,用于在 Web 上存储和传输数据。在 PHP 中,我们可以使用数组作为数据结构将数据存储起来,然后将其转换为 XML 格式。但是,有时在将 XML 转换回 PHP 数组时可能会遇到问题。接下来,我们将探讨这个问题,并提供解决方案。
一、数组转 XML
在 PHP 中将数组转换为 XML 格式很简单。我们只需要遍历数组并使用 PHP 内置函数将其转换为 XML。下面是一个示例代码:1
2
3
4
5
6
7
8
9
10
<?php
$data = array(
name => John,
age => 30,
gender => male
);
$xml = new SimpleXMLElement(<data/>);
array_walk_recursive($data, array($xml, addChild));
echo $xml->asXML();
?>
输出:
1
2
3
4
5
6
<?xml version=”1.0″?>
<data>
<name>John</name>
<age>30</age>
<gender>male</gender>
</data>
我们可以使用 SimpleXMLElement 类来创建新的 XML 文档。然后将数组数据添加到 XML 标记中。
二、 XML 转数组
将 XML 转换回 PHP 数组相对麻烦一些。PHP 内置函数不支持此功能。但是,SimpleXML 扩展提供了一种解析 XML 的方法,并将其转换为对象。在这个对象中,我们可以使用属性名称获取其值。例如,以下是一个示例 XML 文档:1
2
3
4
5
6
<?xml version=”1.0″?>
<data>
<name>John</name>
<age>30</age>
<gender>male</gender>
</data>
我们可以将其转换为 PHP 数组:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$xmlString = <<<XML
<?xml version=”1.0″?>
<data>
<name>John</name>
<age>30</age>
<gender>male</gender>
</data>
XML;
$xmlObject = simplexml_load_string($xmlString);
$json = json_encode($xmlObject);
$array = json_decode($json,TRUE);
var_dump($array);
?>
输出:
1
2
3
4
5
6
7
8
array(3) {
[“name”]=>
string(4) “John”
[“age”]=>
string(2) “30”
[“gender”]=>
string(4) “male”
}
我们使用 simplexml_load_string 函数将 XML 字符串转换为 SimpleXML 对象,然后使用 PHP 内置 json_encode 函数将其转换为 JSON 字符串。最后使用 json_decode 函数将 JSON 字符串转换为数组。
三、 XML 转换回数组时的问题
如果我们在将 XML 转换为 PHP 数组时遇到问题,这可能是因为 SimpleXML 对象的属性名称中包含了特殊字符。例如,以下是一个示例 XML 文档:1
2
3
4
5
6
7
8
<?xml version=”1.0″?>
<data>
<company-name>ABC Inc.</company-name>
<employees>
<employee id=”1″>John</employee>
<employee id=”2″>Mike</employee>
</employees>
</data>
以下是尝试将此 XML 转换为 PHP 数组的示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$xmlString = <<<XML
<?xml version=”1.0″?>
<data>
<company-name>ABC Inc.</company-name>
<employees>
<employee id=”1″>John</employee>
<employee id=”2″>Mike</employee>
</employees>
</data>
XML;
$xmlObject = simplexml_load_string($xmlString);
$json = json_encode($xmlObject);
$array = json_decode($json,TRUE);
var_dump($array);
?>
输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array(2) {
[“company-name”]=>
string(8) “ABC Inc.”
[“employees”]=>
array(1) {
[“employee”]=>
array(2) {
[0]=>
string(4) “John”
[1]=>
string(4) “Mike”
}
}
}
在输出中,”employee” 作为一个数组返回,而不是包含 employee 名称和属性的关联数组。这是因为属性名称中的减号 “-” 会导致关联数组的键名称错误。例如,我们可以将 “company-name” 更改为 “company_name” 然后运行相同的代码。以下是示例:
1
2
3
4
5
6
7
8
<?xml version=”1.0″?>
<data>
<company_name>ABC Inc.</company_name>
<employees>
<employee id=”1″>John</employee>
<employee id=”2″>Mike</employee>
</employees>
</data>
以下是输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array(2) {
[“company_name”]=>
string(8) “ABC Inc.”
[“employees”]=>
array(1) {
[“employee”]=>
array(2) {
[0]=>
string(4) “John”
[1]=>
string(4) “Mike”
}
}
}
在这个输出中,”employee” 作为关联数组返回,并包括 employee 名称和属性。
解决此问题的方法是使用 SimpleXML 对象中的属性名称而不是作为键名称。以下是一个带有特殊字符的示例 XML 文档和 PHP 代码:
1
2
3
4
5
6
7
8
<?xml version=”1.0″?>
<data>
<company-name>ABC Inc.</company-name>
<employees>
<employee id=”1″>John</employee>
<employee id=”2″>Mike</employee>
</employees>
</data>
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
<?php
$xmlString = <<<XML
<?xml version=”1.0″?>
<data>
<company-name>ABC Inc.</company-name>
<employees>
<employee id=”1″>John</employee>
<employee id=”2″>Mike</employee>
</employees>
</data>
XML;
$xmlObject = simplexml_load_string($xmlString);
$result = array();
foreach ($xmlObject as $key => $value) {
if ($value->count() > 0) {
foreach ($value as $childKey => $childValue) {
$data = array();
foreach ($childValue->attributes() as $attributeName => $attributeValue) {
$data[“@” . $attributeName] = (string) $attributeValue;
}
$data[“name”] = $childValue->__toString();
if (!isset($result[$key]) || !is_array($result[$key])) {
$result[$key] = array();
}
array_push($result[$key], $data);
}
}
else {
$data = (string) $value;
if (isset($result[$key])) {
if (!is_array($result[$key])) {
$result[$key] = array($result[$key]);
}
array_push($result[$key], $data);
}
else {
$result[$key] = $data;
}
}
}
var_dump($result);
?>
代码实现了一种使用 SimpleXML 对象中的属性名称将 XML 转换为 PHP 数组的方法。在此示例中,包含属性的 XML 标记将转换为关联数组。例如,以下是我们的示例 XML 文档的输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
array(2) {
[“company-name”]=>
string(8) “ABC Inc.”
[“employees”]=>
array(2) {
[0]=>
array(2) {
[“@id”]=>
string(1) “1”
[“name”]=>
string(4) “John”
}
[1]=>
array(2) {
[“@id”]=>
string(1) “2”
[“name”]=>
string(4) “Mike”
}
}
}
从输出中可以看出,该方法正确地将属性名称解析为关联数组,并将其与其他标记一起包含在同一数组中。
结论:
在 PHP 中,将数组转换为 XML 并将其转换回数组相对简单。但是,在将 XML 转换回 PHP 数组时可能会遇到问题,特别是属性名称中包含特殊字符的情况。使用 SimpleXML 对象中的属性名称可以解决此问题,因为在解析 XML 时会将其转换为关联数组。通过了解这些诀窍,您应该能够成功地在 PHP 中转换 XML 和数组之间的格式。
以上就是php数组转xml转不回来的详细内容,更多请关注php中文网其它相关文章!
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布投稿,分享有佣金分成!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务 请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长,可领回失去的金币,并额外有奖!
6. 如遇到加密压缩包,默认解压密码为"www.77ym.top",如遇到无法解压的请联系管理员!
7. 本站部分文章、资源来自互联网,版权归原作者及网站所有,如果侵犯了您的权利,请及时联系我站删除。免责声明
暂无评论内容