HTMLParser (開源 HTML 解析庫) 內建豐富標籤類 (含 JSP/ASP 動態標籤),但對 WML、XML 等自定義標籤無內建支援。本文示範如何擴展解析 <anchor>...<go href=...> 等 WML 連結標籤。
現在登入
返回首頁
目標:同時提取 <a href> 與 <go href> 連結。
CompositeTag (複合標籤,有開始/結束標籤且可巢狀)。
public class WmlGoTag extends CompositeTag {
private static final String[] IDS = {"GO"};
private static final String[] END_TAG_ENDERS = {"ANCHOR"}; // 父標籤
public String[] getIds() { return IDS; } // 開始標籤識別
public String[] getEnders() { return IDS; } // 結束標籤識別 (同開始)
public String[] getEndTagEnders() { return END_TAG_ENDERS; } // 父標籤輔助判斷結束
public String getLink() { return getAttribute("href"); }
public String getMethod() { return getAttribute("method"); }
}
註:HTML 格式寬鬆需 getEndTagEnders 輔助;WML/XHTML 嚴格則可省略。
Parser parser = new Parser();
PrototypicalNodeFactory factory = new PrototypicalNodeFactory();
factory.registerTag(new WmlGoTag());
parser.setNodeFactory(factory);
LinkTag (內建) 與 WmlGoTag (自定義):
NodeFilter linkFilter = new NodeFilter() {
public boolean accept(Node node) {
return node instanceof LinkTag || node instanceof WmlGoTag;
}
};
NodeList list = parser.extractAllNodesThatMatch(linkFilter);
for (Node n : list.toNodeArray()) {
if (n instanceof LinkTag) System.out.println("LINK: " + ((LinkTag)n).getLink());
else if (n instanceof WmlGoTag) System.out.println("GO: " + ((WmlGoTag)n).getLink());
}
GO: /wap/user.do
LINK: /wap/index.vm
HTMLParser 節點層級:Node → Tag (簡單標籤如 <img>) / CompositeTag (複合標籤如 <a>...</a>)。自定義標籤依類型繼承對應基類,覆寫識別方法即可。
HTMLParser 開源碼本身即最佳教材,參考內建 ImageTag、LinkTag 等實現可快速掌握擴展技巧,支援任意 XML/HTML/WML 自定義標籤解析。
本文來自編程入門網:原文連結