我需要根据它的子ProgramList的值对以下XML (foreach MajorDescription )进行排序
<ArrayOfProgramList xmlns="http://schemas.datacontract.org/2004/07/Taca.Resources" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ProgramList>
<AreaOfInterests xmlns:a="http://schemas.datacontract.org/2004/07/Taca">
<a:AreaOfInterest>
<a:Interest>ABORIGINAL STUDIES</a:Interest>
</a:AreaOfInterest>
</AreaOfInterests>
<Coop>true</Coop>
<MajorDescription>ABORIGINAL COMMUNITY AND SOCIAL DEVELOPMENT</MajorDescription>
<Program>ACSD</Program>
<ProgramLocations>
<ProgramLocation>
<Campus>Barrie</Campus>
</ProgramLocation>
</ProgramLocations>
<Term>201210</Term>
</ProgramList>
<ProgramList>
<AreaOfInterests xmlns:a="http://schemas.datacontract.org/2004/07/Taca">
<a:AreaOfInterest>
<a:Interest>GRADUATE CERTIFICATE STUDIES</a:Interest>
</a:AreaOfInterest>
<a:AreaOfInterest>
<a:Interest>HEALTH AND WELLNESS STUDIES</a:Interest>
</a:AreaOfInterest>
</AreaOfInterests>
<Coop>false</Coop>
<MajorDescription>ADVANCED CARE PARAMEDIC</MajorDescription>
<Program>PARM</Program>
<ProgramLocations>
<ProgramLocation>
<Campus>Barrie</Campus>
</ProgramLocation>
</ProgramLocations>
<Term>201210</Term>
</ProgramList>
</ArrayOfProgramList>我正在尝试用SimpleDOM来完成它,因为我已经读到了这是在其他问题上排序XML的最简单的方法。
我试过用:
foreach($listxml->sortedXPath('//ArrayOfProgramList/ProgramList','//ArrayOfProgramList/ProgramList/MajorDescription') as $program){ ... }以及其他各种类似的“排序”值,如“@MajorDescription”、“/MajorDescription”和“”。正如这里所建议的,How does one use SimpleDOM sortedXPath to sort on node value?但是当我用var_dump()检查它时,所有东西都返回一个空数组。
我认为问题在于,我需要对子节点的值进行排序--这有可能吗?前端需要放在ProgramList上,因为我需要在每次迭代中输出ProgramList中所有子节点的值。
有什么建议吗?我不需要使用SimpleDOM,我对任何可行的方法都是开放的--目前我正在遍历一个any数组,对于每个字母,迭代ProgramList,将MajorDescription的第一个字母与当前字母进行比较,如果匹配的话输出--这显然不是理想的,只对第一个字母进行排序.
发布于 2013-01-10 18:28:44
您可以尝试将所有ProgramList元素放入数组中,并根据自定义函数对其进行排序。代码应该如下所示:
function cmp($a, $b)
{
return strcmp($a->MajorDescription[0],$b->MajorDescription[0])
}
$arr = $listxml->xpath("//ArrayOfProgramList/ProgramList");
usort($arr,"cmp");发布于 2013-01-11 18:01:18
原始代码有两个问题。首先,XML使用默认名称空间,而且从设计上看,XPath不支持默认名称空间,因此您必须查找名称空间节点(例如,//foo:bar,而不是//bar)来查找它们。如果不能为此命名空间注册前缀(例如,如果不能修改源XML),则可以使用通配符//*与匹配节点名称空间和/或本地名称的谓词相结合的通配符匹配命名空间节点。
$nsPredicate = '[namespace-uri() = "http://schemas.datacontract.org/2004/07/Taca.Resources"]';
$query = '//*[local-name() = "ArrayOfProgramList"]' . $nsPredicate
. '/*[local-name() = "ProgramList"]' . $nsPredicate;
$orderBy = '*[local-name() = "MajorDescription"]' . $nsPredicate;
foreach ($listxml->sortedXPath($query, $orderBy) as $program)
{
echo $program->asXML(),"\n";
}另一个问题是排序标准。它应该从目标节点的上下文中写入。
https://stackoverflow.com/questions/14263259
复制相似问题