2013-02-14 33 views
0

我想用XML解析器和SGML文档,但是这不起作用。看过一些建议后,似乎只能解决这个问题,那就是使用一个HTML解析器。所以即时通讯基本上只是试图做一个简单的查询,将从我的文档中提取故事标题。 (它工作,如果我解析null - 打印整个文档,只是我不知道如何访问一个特定的标签,如标题)。在SGML中使用HTML解析器

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> 
+0

XML和HTML都与SGML相关,但它们都不兼容。为什么不使用SGML解析器? http://stackoverflow.com/questions/4867894/sgml-parser-in-java – Philipp 2013-02-14 14:59:03

+0

我早些时候阅读过这个线程,如果你可以建议一个很好的话,那么如何使用SGML解析器还没有确定的答案。所有的建议似乎都导致了HTML解析器。顺便说一句,我尝试了SAX解析器,并失败了 – maloney 2013-02-14 15:01:26

回答

1

从你的例子似乎是你的内容模型是很简单的。在这种情况下,你可以实现一个简单的特别解析。

如果您确定不使用标记部分(不仅仅是因为CDATA部分,而且因为status关键字可能在参数实体中给出,这会使所有内容更加复杂)以及SGML的深奥特征(如DATATAG)没有被使用,你可以只删除任何注释,然后扫描以下模式:

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

哪个让你在内容的开始,假设f有一个属性ID(和起始标签没有被最小化,因为它可能是未封闭的或网络使能的)。然后扫描,直到“<”,并voilà。

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