基于我所阅读的内容,似乎在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;
}
答案 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);
您应该确保这些值的顺序正确。