2

我正在为我的组织创建非常简单的 CMS。

我的策略是在名为 <editable> 的标签之间嵌入可编辑内容。但是,为了从浏览器中隐藏这些,我将它们注释掉。因此,可编辑区域的示例将如下所示。

<!-- <editable name="news_item> Today's news is ... </editable> -->

随着内容“今天的新闻是……”被 CMS 拾取并在在线 HTML 编辑器中进行编辑。

我希望能够“抓取”名称属性的值以及标签中包含的内容。

有没有一种简单的方法可以用 XPath、XQuey 类型的东西来做到这一点,或者正则表达式是最好的方法(]esp。因为正则表达式不需要太多的容错,因为我确切地知道 xml 将是什么,因为我将编写生成它的代码)。

4

6 回答 6

3

大多数解析器都能够毫无问题地获得注释。他们可能不会将它们解析为 DOM 结构,但您可以在获得实际评论后手动使用它们进行解析。

这是一个在 Python中使用BeautifulSoup的示例:

>>> from BeautifulSoup import BeautifulSoup, Comment
>>> html_document = """
... <html>
... <head>
... </head>
... <body>
... <h1>My Html Document</h1>
... <!-- This is a normal comment. -->
... <p>This is some more text.</p>
... <!-- <editable name="news_item">Today's news is Paolo Rocks!</editable> -->
... <p>Yet More Content</p>
... </body>
... </html>
... """
>>> soup = BeautifulSoup(html_document)
>>> comments = soup.findAll(text=lambda text:isinstance(text,Comment))
>>> comments
[u' This is a normal comment. ', u' <editable name="news_item">Today\'s news is
Paolo Rocks!</editable> ']
>>> for comment in comments:
...     editable = BeautifulSoup(comment).find('editable')
...     if editable is not None:
...             print editable['name'], editable.contents
...
news_item [u"Today's news is Paolo Rocks!"]
于 2009-06-15T06:56:33.150 回答
3

DOM Parser 是指 javascript 吗?如果是这样,这篇博文建议您确实可以对 HTML 评论进行切片和切块。而且,因为只提到 javascript 而没有提到 jQuery 是一种罪过,所以这里有一个 jQuery 插件,它可以为你找到所有的 HTML 注释。

于 2009-06-15T07:03:12.137 回答
2

注释的全部意义在于 DOM 不会解析内容。所以整个评论只是文字。

在这种情况下,我倾向于使用 RegEx。

但是,如果您确定内容是 HTML,您将创建一个 DOM 元素(例如 DIV)并将注释文本分配给 innerHTML。您可以检查从元素创建的 DOM。一旦你获得了你需要的东西,你就可以删除你永远不会添加到当前文档中的 DIV 元素。

于 2009-06-15T06:56:29.623 回答
0

我很确定您需要通过正则表达式或其他方法手动解析它。据我所知,评论不被视为 DOM 元素。

于 2009-06-15T06:54:12.063 回答
0

您可以使用带有服装属性的 DIV,例如 Dojo 做了很多工作:

<div ParseByCMS="true">foobar foo bar foobaz</div>

之后,您只需使用 javascript 或 xslt 解析并删除它。

于 2009-06-15T06:59:46.950 回答
0

如果您使用的是 PHP。

    $xpath = new DOMXpath(new DOMDocument());

    // Search for comments
    $comments = $xpath->query('//comment()');
于 2009-06-15T07:02:24.570 回答