0

PHP スクリプトを使用して XML ファイルを変換しようとしています。私は次の構造を持っています:

<?xml version="1.0"?>
<persons>

<person id="1">
      <periods>3</periods>
      <name id="John"/>
      <times>
        <time>
          <day id="1"/>
          <time>35:28</time >
          <length>8000</length>
        </time>
        <time>
          <day id="4"/>
          <time>8:28</time >
          <length>2000</length>
        </time>
        <time>
          <day id="5"/>
          <time>3:03</time >
          <length>1000</length>
        </time>
      </times>
    </person>

 <person id="2">
      <periods>3</periods>
      <name id="James"/>
      <times>
        <time>
          <day id="3"/>
          <time>45:20</time >
          <length>15000</length>
        </time>
        <time>
          <day id="5"/>
          <time>4:48</time >
          <length>1500</length>
        </time>
      </times>
    </person>
etc…
etc…
</persons>

すべての人は、1 つまたは複数の時間要素を持っています。個人要素ごとに 1 つの時間要素のみを取得するように、構造を変換したい (以下の構造のように)。

 </p>

<?xml version="1.0"?>
<persons>
    <person id="1">
      <periods>3</periods>
      <name id="John"/>
      <times>
        <time>
          <day id="1"/>
          <time>35:28</time >
          <length>8000</length>
        </time>
      </times>
    </person>

    <person id="1">
      <periods>3</periods>
      <name id="John"/>
      <times>
        <time>
          <day id="4"/>
          <time>8:28</time >
          <length>2000</length>
        </time>
      </times>
    </person>

    <person id="1">
      <periods>3</periods>
      <name id="John"/>
      <times>
        <time>
          <day id="5"/>
          <time>3:03</time >
          <length>1000</length>
        </time>
      </times>
    </person>

<person id="2">
      <periods>2</periods>
      <name id="James"/>
      <times>
        <time>
          <day id="3"/>
          <time>45:20</time >
          <length>15000</length>
        </time>
      </times>
    </person>

<person id="2">
      <periods>2</periods>
      <name id="James"/>
      <times>
        <time>
          <day id="5"/>
          <time>4:48</time >
          <length>1500</length>
        </time>
      </times>
    </person>
</persons>

これを行う方法はありますか?

4

1 に答える 1

0

私は本当に英語がとても苦手ですが、答えようとします:)

このタスクの実装には、SimpleXml および Dom 拡張機能が適していると思います。以下は、必要な変換を行う単純なスクリプトです。input.xml は、ソース テキストを含むファイルです。アルゴリズムの結果は output.xml ファイルに保存されます。

<?php
$simpleXml = new SimpleXMLElement(file_get_contents('input.xml'));
$personElements = $simpleXml->person;

$personForAppend = array();
$personsForRemove = array();

foreach ($personElements as $personElement) {
    $timeElements = $personElement->times->xpath("child::time");
    $numberOfTimeElements = count($timeElements);

    if ($numberOfTimeElements > 1) {
        $personDomElement = dom_import_simplexml($personElement);
        $backupTimeDomElementArray = array();

        foreach ($timeElements as $timeElement) {
            $timeDomElement = dom_import_simplexml($timeElement);
            $backupTimeDomElementArray[] = clone $timeDomElement;
            $timeDomElement->parentNode->removeChild(
                $timeDomElement
            );
        }

        while ($timeDomElement = array_shift($backupTimeDomElementArray)) {
            $copyPersonDomElement = clone $personDomElement;
            $copyPersonDomElement->getElementsByTagName('times')
                ->item(0)->appendChild($timeDomElement);
            $personForAppend[] = $copyPersonDomElement;
        }
        $personsForRemove[] = $personDomElement;
    }
}

foreach ($personForAppend as $personDomeNode) {
    $personDomElement->parentNode->appendChild($personDomeNode);
}

foreach ($personsForRemove as $personDomElement) {
    $personDomElement->parentNode->removeChild($personDomElement);
}
$simpleXml->saveXML('output.xml'); 
于 2013-10-27T18:20:38.547 に答える