【问题标题】:Using HTML Parser with SGML将 HTML 解析器与 SGML 一起使用
【发布时间】:2013-01-30 09:58:23
【问题描述】:

我想将XML 解析器与SGML 文档一起使用,但这不起作用。在阅读了一些建议之后,似乎唯一的办法就是使用HTML 解析器。所以我基本上只是尝试做一个简单的查询,从我的文档中提取故事标题。 (如果我解析 null - 打印整个文档,它会起作用,只是我不确定如何访问特定标签,例如标题)。

public static void main(String[] args){
    Parser parser = new Parser(xmlFile.getAbsolutePath());
    NodeList list = parser.parse (new HasAttributeFilter ("id","title"));
    Node node = list.elementAt(0);

    if (node instanceof TagNode) {
       TagNode meta = (TagNode) node;
       String description = meta.getAttribute("title");
       System.out.println(description);
    }
}

SGML 文件的开始:

<head>
<meta words=61 rate=180>
<formname>Testing</formname>
<storyid>1234</storyid>
</head>
<story>
<fields>
<f id=title>Sports</f>
<f id=modify-by>Tester</f>
<f id=modify-date>315576000</f>
</fields>
<body>

【问题讨论】:

  • XML 和 HTML 都与 SGML 相关,但它们都不兼容。为什么不使用 SGML 解析器? stackoverflow.com/questions/4867894/sgml-parser-in-java
  • 我之前读过那个帖子,关于如何使用 SGML 解析器没有明确的答案,如果你能推荐一个那么好。所有的建议似乎都导致了 HTML 解析器。顺便说一句,我尝试了 SAX 解析器,但失败了

标签: java html xml html-parsing sgml


【解决方案1】:

从您的示例看来,您的内容模型非常简单。在这种情况下,您可以实现一个简单的即席解析。

如果您非常确定没有使用标记的部分(不仅因为 CDATA 部分,还因为状态关键字可以在参数实体中给出,这会使一切变得更加复杂),并且 SGML 的深奥特征(例如因为 DATATAG) 没有被使用,您可以删除任何评论,然后扫描以下模式:

(?i)<f\s+id\s*=\s*["']?title["']?\s*>

假设 f 具有单个属性 id(并且起始标签未最小化,因为它可能未关闭或启用网络),这会让您留在内容的开头。然后扫描到“

当然,更灵活的东西当然需要 SGML 解析器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2010-09-09
    • 2021-03-06
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多