将XML行解析为json字符串

时间:2014-06-17 11:54:57

标签: php xml json

我需要在不同的行上获取两个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字符串。

我希望我能够清楚地解释清楚。真正的初学者:)

2 个答案:

答案 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"
        }
    }
]