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