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


Parse XML in row/value format to custom objects in PHP

根据我所阅读的内容,似乎在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;    
}

假设您有一个名为 $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);

应确保值的顺序正确,以便正常工作。

您应该使用路径"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]