0

子 MajorDescription の値に基づいて、次の XML (foreach ProgramList) を並べ替える必要があります。

<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>

他のSOの質問でXMLをソートする最も簡単な方法を読んだので、SimpleDOMでそれをやろうとしています。

私は使用してみました:

foreach($listxml->sortedXPath('//ArrayOfProgramList/ProgramList','//ArrayOfProgramList/ProgramList/MajorDescription') as $program){ ... }

および「@MajorDescription」、「/MajorDescription」、「.」などの他の同様の「並べ替え」値。ここで提案されているように、SimpleDOM sortedXPath を使用してノード値でソートするにはどうすればよいですか? しかし、 var_dump() でチェックすると、すべてが空の配列を返します

問題は、子ノードの値でソートする必要があることだと思います-これは可能ですか? 各反復で ProgramList 内のすべての子ノードの値を出力する必要があるため、foreach は ProgramList 上にある必要があります。

助言がありますか?SimpleDOM を使用する必要はありません。動作する任意の方法を受け入れます。現在、AZ の配列を反復処理し、文字ごとに ProgramList を反復処理し、MajorDescription の最初の文字を現在の文字と比較して、一致する場合は出力します-これは明らかに理想的ではなく、最初の文字のみをソートします...

4

2 に答える 2

1

すべての ProgramList 要素を配列に入れて、カスタム関数に従って並べ替えることができます。コードは次のようになります。

function cmp($a, $b)
{
  return strcmp($a->MajorDescription[0],$b->MajorDescription[0])
}

$arr = $listxml->xpath("//ArrayOfProgramList/ProgramList");
usort($arr,"cmp");
于 2013-01-10T18:28:44.210 に答える
0

元のコードには2つの問題があります。1つ目は、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";
}

もう1つの問題は、ソート基準にあります。ターゲットノードのコンテキストから書き込む必要があります。

于 2013-01-11T18:01:18.940 に答える