2

我在这里阅读了几个似乎与我遇到的问题相关(直接或间接)的问题,但到目前为止没有一个问题能满足我的具体需求,所以我想我会解释一下我的情况,看看是否我们可以一起想出一个答案。

我有一个 XML 类别数据库(特别是 AIML),我想使用 simpleXML 函数来解析它,以提供合适的输出。此解析后的输出是从所选类别中的标签处理的。一个简单的示例类别如下所示:

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

上面显示的 <template> 标记可以包含文本(如上所示),也可以包含任意数量的不同 AIML 标记中的一个或多个,可以单独保存,也可以散布在文本中。可能性几乎是无穷无尽的。这是一个更复杂的例子:

<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 标签,我解析它的内容没有问题,但如果它有文本和标签的组合,如第二和第三个外部 <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 回答