我在这里读过几个问题,这些问题似乎与我的问题有直接或间接的关系,但到目前为止还没有一个问题能满足我的具体需要,所以我想我可以解释一下我的情况,看看我们能不能一起想出一个答案。
我有一个XML类别的数据库(具体来说,是AIML),我想使用simpleXML函数来解析,以得到一个合适的输出。此分析输出是从选定类别中的标记处理的。一个简单的示例类别如下所示:
<category>
<pattern>HOW ARE YOU</pattern>
<template>I am fine, how are you?</template>
</category>上面显示的标记可以保存文本(如上面所示),也可以单独保存任意数量的不同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标记,我对解析它的内容没有问题,但是如果它有文本和标记的组合,就像上面示例的第二和第三部分一样,如果有文本优先,或者文本,如果前面有一个标记,我就会丢失这些标记。无论文本如何“深”或“浅”,这个问题都会出现在标签中。因此,我在这里有点问题。
正如我已经提到的,我读过几个这样的问题,到目前为止我还没有找到一个令人满意的答案。但是,我怀疑这可能是因为我没有完全理解所涉及的一些概念,因此可能没有正确地实现某些解决方案。例如,这个职位提到使用xslt对xml进行“预处理”,这似乎解决了我的问题,但我完全不知道如何实现这个问题。另外,我不使用xStream,所以我甚至不知道这是否是可以实现的东西。恐怕我从来没有接受过PHP的正式培训,所以我的经验有点不稳定。:)
我希望我已经提供了足够的信息,以清楚我的情况,而不是太“冗长”。
发布于 2012-06-29 14:40:34
虽然这可能不是解决我的问题的最好的方法,但我已经找到了一种相当简单的、(至少对我来说)有点优雅的方法来处理我的问题,方法是使用preg_replace()将纯文本的任何实例封装在标记中。我想出的是:
//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。正如我所说的,这可能不是最好的方法,但它是有效的,并且只增加了几行代码。我仍然很想听听其他处理这个问题的方法,但是现在,这就可以了。我希望这能帮到别人。:)
发布于 2016-02-10 17:07:30
虽然建议的答案确实很聪明,但我发现自己完全放弃了SimpleXML,而是使用了PHP内置的DOMElement类。它支持将裸露文本内容作为自己的离散节点公开的类和方法。
https://stackoverflow.com/questions/11251197
复制相似问题