我需要在不同的行上获取两个XML标记之间的值。 XML文件是多级的。例如,我需要<student>
和</student>
之间的每个数据,这个数据生成数据库中的JSON字符串:
<SchoolRoster>
<Student>
<name>John</name>
<age>14</age>
<course>
<math>A</math>
<english>B</english>
</course>
<course>
<government>A+</government>
</course>
</Student>
<Student>
<name>Tom</name>
<age>13</age>
<course>
<gym>A</gym>
<geography>incomplete</geography>
</course>
</Student>
</SchoolRoster>
我尝试了以下内容:
$entities = new SimpleXMLElement($xml);
preg_match_all('/<Student>(.*?)<\/Student>/s', $entities, $json);
$obj = json_encode($json);
这只会返回
[]
有什么想法?它应该返回一个JSON字符串。
我希望我能够清楚地解释清楚。真正的初学者:)
答案 0 :(得分:0)
您无法针对preg_match_all
对象投放SimpleXMLElement
。
使用foreach循环迭代所有学生并创建一个简单的数组,然后您可以将其编码为JSON字符串。
$xml = new SimpleXMLElement($yourXmlStr);
$studentsArr = array();
foreach($xml->student as $student) {
// Dump student data in temp array
}
echo json_encode($studentsArr);
答案 1 :(得分:0)
实际上,当我运行你的例子时,它给了我:
[[],[]]
然而,正如已经回答的那样,您无法在 SimpleXMLElement 上运行preg_match_all
,至少不能以有用的方式运行。相反,它更容易,例如the SimpleXMLElement ships with an expression matcher:
$entities = new SimpleXMLElement($xml);
$json = $entities->xpath('//Student');
$obj = json_encode($json);
它叫做xpath,它是XML的查询/表达式语言。正则表达式用于通用字符串,而不是专门用于XML。
或者,您也可以在案例中使用iterator_to_array
:
$entities = new SimpleXMLElement($xml);
$json = iterator_to_array($entities->Student, false);
$obj = json_encode($json);
两个例子都会产生相同的结果,这会给你(漂亮印刷):
[
{
"name": "John",
"age": "14",
"course": [
{
"math": "A",
"english": "B"
},
{
"government": "A+"
}
]
},
{
"name": "Tom",
"age": "13",
"course": {
"gym": "A",
"geography": "incomplete"
}
}
]