1

ここで解決策を探すために過去 2 晩を費やしましたが、これを理解することができませんでした。複数の XML ファイルがあり、それらすべてをループして、同じ属性を含むノードを探し、それらのすべてのノードを出力ファイルにマージしたいと考えています。次に例を示します。

File1.xml

<game rotnum="241">
  <gamedate> 123 </gamedate>
  <team1> Giants </team1>
  <team2> Eagles </team2>
</game>

File2.xml

<game rotnum="241">
  <line> 4 </line>
  <points> 200 </points>
</game>

Merged.xml

<game rotnum="241">
  <gamedate> 123 </gamedate>
  <team1> Giants </team1>
  <team2> Eagles </team2>
  <line> 4 </line>
  <points> 200 </points>
</game>

多かれ少なかれ。PHP でこれを行う必要があり、DOM を使用する方が XSLT よりも簡単だと考えています (これについてはよくわかりません)。

複数のファイル全体に多数のノードがあり、同様の rotnum 属性に基づいてデータを照合する必要があります。

必ずしもこれを行う必要があるかどうかはわかりませんが、すべてのデータを 1 つの simpleXML オブジェクトにまとめ、ゲームごとに個別のテーブルを作成して生成できるようにする最も簡単な方法です。

これらの XML ファイルは、SimpleXML を使用して作成し、ローカルにキャッシュした複数の API フィードからのものです。

function stripAndSaveFile($xml) {
    $game = $xml->game;
    $output = new SimpleXMLElement("<justbetlinesfeed></justbetlinesfeed>");
    for ($i = 0; $i < 16; $i++) {
        //Get the date of each game. 
        $spreadpoints = $game[$i]->line->spread->attributes()->points;
        $spreadteam1 = $game[$i]->line->spread->attributes()->team1adj;
        $spreadteam2 = $game[$i]->line->spread->attributes()->team2adj;
        $rotnum = $game[$i]->attributes()->team1rotnum;
        $insert = $output->addChild("game");
        $insert->addAttribute("rotnum", "$rotnum");
        $insert->addChild("spreadpoints", "$spreadpoints");
        $insert->addChild("spreadteam1", "$spreadteam1");
        $insert->addChild("spreadteam2", "$spreadteam2");

    }
    file_put_contents($this->filePath, $output->asXML());
}
}
4

2 に答える 2

1

これはあなたが探しているものではないかもしれませんが、アイデアが得られるかもしれません。これには、 Saxonなどの XSLT 2.0 プロセッサが必要です。

実行しているのは、コレクション (テスト用のローカル ディレクトリ) 内のすべての XML ファイルを調べrotnum、ルート要素の属性によってそれらをグループ化することです。ルートの下にあるすべての子を効果的に 1 つのファイルにマージしています。ファイルは別のディレクトリに作成され、名前は値に基づいていrotnumます。

XSLT への入力は任意の XML です。スタイルシート自体を入力として使用しました。

これが例です...

「input_dir」ディレクトリ内の XML ファイル:

file1.xml

<game rotnum="241">
  <gamedate> 123 </gamedate>
  <team1> Giants </team1>
  <team2> Eagles </team2>
</game>

file2.xml

<game rotnum="241">
  <line> 4 </line>
  <points> 200 </points>
</game>

XSLT 2.0 (Saxon-HE 9.4 でテスト済み)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:variable name="vCollection" select="collection('file:///C:/some_absolute_uri/input_dir?input=*.xml')"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/">
        <xsl:for-each-group select="$vCollection/*" group-by="@rotnum">
            <xsl:result-document href="file:///C:/some_absolute_uri/output_dir/{@rotnum}.xml">
                <xsl:copy>
                    <xsl:apply-templates select="@*"/>
                    <xsl:apply-templates select="$vCollection/*[@rotnum=current-grouping-key()]/*"/>                    
                </xsl:copy>
            </xsl:result-document>
        </xsl:for-each-group>
    </xsl:template>

</xsl:stylesheet>

"output_dir" ディレクトリ内の XML ファイル:

241.xml

<game rotnum="241">
   <gamedate> 123 </gamedate>
   <team1> Giants </team1>
   <team2> Eagles </team2>
   <line> 4 </line>
   <points> 200 </points>
</game>
于 2012-08-02T06:56:13.127 に答える
1

この種の状況では、DomDocumentのようなものを使用することを好みます

ドキュメントを読む:

$dom = new DomDocument();
$dom->load('filename.xml');
$games = $menu->getElementsByTagName("game");
foreach ($games as $game) {
    if($game->hasChildNodes)
    { 
         //Set element
         $element->nodeValue;
         //Store to array or similar
    }
于 2012-08-02T06:30:51.807 に答える