2

私が抱えている問題に(直接的または間接的に)関連していると思われるいくつかの質問をここで読みましたが、これまでのところ私の特定のニーズに満足できるものはなかったので、状況を説明して、私たちは一緒に答えを思いつくことができます。

SimpleXML関数を使用して解析し、適切な出力を作成したいXMLカテゴリ(具体的にはAIML)のデータベースがあります。この解析された出力は、選択されたカテゴリ内のタグから処理されます。簡単なカテゴリの例は次のようになります。

<category>  
  <pattern>HOW ARE YOU</pattern>  
  <template>I am fine, how are you?</template> 
</category>

上に示した<template>タグは、上に示したようにテキストを保持することも、単独で、またはテキストを散在させて、任意の数の異なるAIMLタグの1つ以上を保持することもできます。可能性は事実上無限です。より複雑な例を次に示します。

<category>
  <pattern>NESTED RANDOM TEST</pattern>
  <template>
    <random>
      <li>
        <random>
          <li>Choice #1-1</li>
          <li>Choice #1-2</li>
          <li>Choice #1-3</li>
        </random>
      </li>
      <li>
        This is some example text, along with another RANDOM tag:
        <random>
          <li>Choice #2-1</li>
          <li>Choice #2-2</li>
          <li>Choice #2-3</li>
        </random>
      </li>
      <li>
        <random>
          <li>Choice #3-1</li>
          <li>Choice #3-2</li>
          <li>Choice #3-3</li>
        </random>
        This is some text that appears [i]after[/i] a RANDOM tag.
      </li>
    </random>
  </template>
</category>

テンプレートタグにテキストのみが含まれている場合、または他のAIMLタグのみが含まれている場合は、コンテンツの解析に問題はありませんが、テキストとタグの組み合わせがある場合は、2番目と3番目の外側の<li>セクションのようになります。上記の例では、最初にテキストがある場合はタグを失い、前にタグがある場合はテキストを失います。この問題は、タグ内のテキストがどれほど「深い」または「浅い」場合でも発生します。したがって、ここで少し問題があります。

すでに述べたように、私はこの性質のいくつかの質問を読みましたが、これまでのところ満足のいく答えは見つかりませんでした。ただし、これは、関連する概念の一部を完全に理解していないため、一部のソリューションを適切に実装していない可能性があるためと思われます。たとえば、この投稿では、xsltを使用してxmlを「前処理」することに言及しており、それで問題が解決するようですが、それを実装する方法についてはまったくわかりません。さらに、私はxStreamを使用していないので、これが実装できるものかどうかさえわかりません。私はPHPの正式なトレーニングを受けたことがないので、私の経験は少しむらがあります。:)

あまりにも「言葉遣い」をせずに、自分の状況を明確にするのに十分な情報を提供できたと思います。

4

2 に答える 2

1

提案された答えは確かに賢いですが、私はSimpleXMLを完全に放棄し、代わりにPHPの組み込みDOMElementクラスを使用していることに気付きました。それはそれ自身の目立たないノードとして裸のテキストコンテンツを公開するクラスとメソッドをサポートします。

于 2016-02-10T17:07:30.297 に答える
0

これは私の問題を解決するための最良の方法ではないかもしれませんが、preg_replace()を使用してプレーンテキストのインスタンスをXMLで囲むことにより、問題を処理するためのかなり単純で(少なくとも私にとっては)やや洗練された方法を見つけました<text>タグの文字列。これが私が思いついたものです:

//First, some simple mixed-content XML:
$myTemplate = '<template>Hello, <get name="name" />. I\'m glad to meet you.</template>';
$myTemplate = preg_replace('~>(.*?)<~', '><text>$1</text><', $myTemplate);
/*
This can add unnecessary, empty <text> tags under certain circumstances, so the next line
removes empty tag sets
*/
$myTemplate = str_replace('<text></text>', '', $myTemplate);
/*
This makes the template look like this:

<template><text>Hello, </text><get name="name" /><text>. I\'m glad to meet you.</text></template>

Now, to load my template as XML.
*/
$xml = new SimpleXMLElement($myTemplate);

そこから、必要に応じてXMLを解析できます。私が言ったように、これはそれを実行するための最良の方法ではないかもしれませんが、それは効果的であり、数行のコードを追加するだけです。私はまだこれを処理する他の方法について聞きたいです、しかし今のところ、これはそうするでしょう。これが他の誰かに役立つことを願っています。:)

于 2012-06-29T14:40:34.800 に答える