将行/值格式的XML解析为PHP中的自定义对象

时间:2016-04-26 19:38:21

标签: php xml

基于我所阅读的内容,似乎在PHP中解析XML的最佳方法是使用simplexml_load_string()方法。我发现的每个示例都包含具有不同子节点名称的XML。在我的例子中,我有一个行/值格式的XML。我希望能够将每一行解析为一个名为“Job”的自定义对象。因此,XML中的每个行节点表示“作业”,每个数据节点表示一个作业属性。在PHP中解析这种类型XML的最佳方法是什么?

以下是我尝试解析的XML示例:

<?xml version="1.0" encoding="utf-8"?>
<dataset  xmlns="http://developer.cognos.com/schemas/xmldata/1/"  xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
<!--
<dataset
    xmlns="http://developer.cognos.com/schemas/xmldata/1/"
    xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
    xs:schemaLocation="http://developer.cognos.com/schemas/xmldata/1/ xmldata.xsd"
>
-->
    <metadata>
          <item name="RequisitionNumber" type="xs:string" length="52"/>
          <item name="Title" type="xs:string" length="52"/>
          <item name="City" type="xs:string" length="52"/>
          <item name="State" type="xs:string" length="52"/>
          <item name="PostalCode" type="xs:string" length="52"/>
          <item name="Description" type="xs:string" length="52"/>
          <item name="Requirements" type="xs:string" length="52"/>
          <item name="ID" type="xs:string" length="52"/>
    </metadata>
    <data>
        <row>
            <value>16-1279</value>
            <value>Manager</value>
            <value>Portland</value>
            <value>OR</value>
            <value>98660</value>
            <value>Manager Description goes here</value>
            <value>Requirements go here</value>
            <value>45</value>
        </row>
        <row>
            <value>16-1279</value>
            <value>Exec</value>
            <value>Portland</value>
            <value>OR</value>
            <value>98660</value>
            <value>Exec Description goes here</value>
            <value>Exec go here</value>
            <value>45</value>
        </row>
    </data>
</dataset>

这是我开始的路径:

class Job
{
        function __construct($requisitionnumber, $title, $city, $state, $postalcode, $description, $requirements)
        {
            $this->RequisitionNumber = $requisitionnumber;
            $this->Title = $title;
            $this->City = $city;
            $this->State = $state;
            $this->PostalCode = $postalcode;
            $this->Description = $description;
            $this->Requirements = $requirements;
        }    
}

function ParseReportResult($xml)
{
    $jobs = array();
    foreach($xml->row) 
    {
        //How do I parse each data node into the below object?
        $job = new Job($requisitionnumber, $title, $city, $state, $postalcode, $description, $requirements);
        array_push($jobs, $job);
    }

    return $jobs;    
}

2 个答案:

答案 0 :(得分:1)

您应该使用路径“data / row”进行访问,然后使用“value”中的索引。它仅在每个数据标记在相同位置具有相同值时才有效:

$content = new SimpleXMLElement($xmldata);

foreach($content->data->row as $item){
   print_r($item->value);   
   $requisitionnumber = $item->value[0]->__toString();
   $title = $item->value[1]->__toString();
   //...
    $job = new Job($requisitionnumber, $title, $city, $state, $postalcode, $description, $requirements);

}

元数据标签包含有关“值”列的信息,因此您可以确保从

读取正确的位置
$content->metadata->item[$position]

答案 1 :(得分:1)

假设您有一个名为$dataset的变量,其中包含您的xml示例,您可以按如下所示访问它:

function ParseReportResult($xml)
{
    $jobs = array();
    foreach($xml->row as $row) 
    {
        $requisitionnumber = (string) $row->value[0];
        $title = (string) $row->value[1];
        $city = (string) $row->value[2];
        $state = (string) $row->value[3];
        $postalcode = (string) $row->value[4];
        $description = (string) $row->value[5];
        $requirements = (string) $row->value[6];

        $job = new Job($requisitionnumber, $title, $city, $state, $postalcode, $description, $requirements);
        array_push($jobs, $job);
    }

    return $jobs;    
}

你可以这样称呼你的函数:

$doc = simplexml_load_string($dataset);
$jobs = ParseReportResult($doc->data);

您应该确保这些值的顺序正确。