首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PHP对SimpleDOM子节点值进行排序?(或任何其他方法)

如何使用PHP对SimpleDOM子节点值进行排序?(或任何其他方法)
EN

Stack Overflow用户
提问于 2013-01-10 17:02:23
回答 2查看 1.5K关注 0票数 0

我需要根据它的子ProgramList的值对以下XML (foreach MajorDescription )进行排序

代码语言:javascript
复制
<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的最简单的方法。

我试过用:

代码语言:javascript
复制
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的第一个字母与当前字母进行比较,如果匹配的话输出--这显然不是理想的,只对第一个字母进行排序.

EN

回答 2

Stack Overflow用户

发布于 2013-01-10 18:28:44

您可以尝试将所有ProgramList元素放入数组中,并根据自定义函数对其进行排序。代码应该如下所示:

代码语言:javascript
复制
function cmp($a, $b)
{
  return strcmp($a->MajorDescription[0],$b->MajorDescription[0])
}

$arr = $listxml->xpath("//ArrayOfProgramList/ProgramList");
usort($arr,"cmp");
票数 1
EN

Stack Overflow用户

发布于 2013-01-11 18:01:18

原始代码有两个问题。首先,XML使用默认名称空间,而且从设计上看,XPath不支持默认名称空间,因此您必须查找名称空间节点(例如,//foo:bar,而不是//bar)来查找它们。如果不能为此命名空间注册前缀(例如,如果不能修改源XML),则可以使用通配符//*与匹配节点名称空间和/或本地名称的谓词相结合的通配符匹配命名空间节点。

代码语言:javascript
复制
$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";
}

另一个问题是排序标准。它应该从目标节点的上下文中写入。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14263259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档