0

非常に単純なレイアウト構造のテキストを含むXMLファイルがあります。

<?xml version='1.0'?>
<page>
  <section>
    <header>Header</header>
    <par>Some paragraph</par>
    <par>Another paragraph with <emph>formatting</emph></par>
  </section>
</page>

PHPでは、SimpleXMLを使用してこのファイルを読み取ります(他のタグを意図的に削除することに注意してください)。

$page = file_get_contents("page.xml");
if ($page) {
  $stripped = strip_tags($page, "<?xml><page><section><header><par><emph>");
  $xml = new SimpleXMLElement($stripped);
}

ここで、XML要素を繰り返し処理し、WebサイトのHTMLとして順番に印刷したいと思います。最終結果は次のスニペットになります。

<h1>Header</h1>
<p>Some paragraph
<p>Another paragraph with <i>formatting</i>

SimpleXMLとXPathを調べて、元のXMLファイルをHTML出力にダイジェストできるようにXMLツリーを反復処理する方法を見つけようとしました。やや望ましい結果を出すことができますが、それ<emph></emph>はなくなったばかりです。どうすれば木にさらに降りることができますか?これまでの私のコード:

foreach ($xml->section as $s) {
  echo "<h1>" . $s->header . "</h1>";
  foreach ($s->par as $p) {
    echo "<p>" . $p;
    //  Do some magic here to ensure <emph> tags are recognized and responded to properly.
  }
}

ヒントやポインタは大歓迎です!ありがとう :-)

4

1 に答える 1

0

まあ、答えがなければ、私は自分で麺を食べなければなりませんでした:-)それで、これが私がしたことであり、それはうまくいきました。

SimpleXMLのものはそれをカットしなかったことが判明したので、私はXMLReaderを使用しました。

$xml = new XMLReader();

次に、XML文字列を手動で解析し、要素から要素にジャンプして、それぞれに作用しました。

if ($xml->xml($stripped)) { // $stripped here is a string that's been validated (see below).
  while (false !== $xml->read()) {
    $t = $xml->nodeType;
    if ($t === XMLReader::ELEMENT) {
      $n = $xml->name;
      switch ($n) {
        case "page":
        case "section":
          // Nothing to echo here.
          break;
        case "header":
          // Handle attributes here
          echo "<h1>";
          break;
        case "par":
          echo "<p> ";
          break;
        case "emph";
          echo "<i>"; // This can also open a <span> for more flexibility later.
          break;
        default:
          // Nothing should arrive here.
          echo "Gah!"
      }
    }
    else if ($t === XMLReader::END_ELEMENT) {
      ... // Close the opened tags here.
    }
    else if ($t === XMLReader::TEXT) {
      $s = $xml->readString();
      echo $s;
    }
    else {
      // Everything else are comments or white spaces.
    }
  }
}

あなたはドリフトを取得します。基本的に、自分でXML構造をバウンスし、要素の種類に応じて、要素の属性とノードを手動で処理する必要がありました。

実際、これは2段階のプロセスです。ここに表示されているのは、有効なXMLドキュメントを前提としています。また、上記のコードの前に実行されるバリデーターがあり、正しい要素が適切にネストされていること、およびネストや属性などの独自の定義に従って、指定されたXMLが「整形式」であることを確認します。バリデーターは、まったく同じ原理に従って動作します。

お役に立てれば。

于 2012-11-07T07:02:57.167 に答える