2013-02-14 2 views
0

Я хотел использовать парсер XML с документом SGML, однако это не работает. После прочтения некоторых предложений, похоже, только так можно использовать парсер HTML. Поэтому я просто пытаюсь сделать простой запрос, который будет извлекать заголовок истории из моего документа. (Он работает, если я разбираю нуль - печатает весь документ, просто не уверен, как получить доступ к определенному тегу, например, название).Использование HTML-анализатора с SGML

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

+0

Я прочитал этот поток раньше, и не было окончательного ответа о том, как использовать синтаксический анализатор SGML, если вы можете предложить один из них великолепно. Все предложения, казалось, привели к HTML Parser. BTW, я попробовал SAX Parser и это не удалось – maloney

ответ

1

Из вашего примера, кажется, что ваша модель содержание очень просто. В этом случае вы можете реализовать простой синтаксический разбор.

Если вы уверены, что отмеченные разделы не используются (не только из-за разделов CDATA, но также и потому, что ключевое слово статуса может быть задано в параметрах, что еще больше усложнит все) и что эзотерические функции SGML (такие как DATATAG) не используются, вы можете просто удалить любой комментарий, а затем сканировать по следующей схеме:

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

который оставляет вас в начале содержания, при условии, что е имеет один атрибуты идентификатор (и что начальный тег не сведен к минимуму, так как он может быть закрыт или включен в сеть). Затем сканируйте до "<", и вуаля.

Конечно, что-то более гибкое, конечно, требует анализатор SGML.