我正在创建一个程序来检查给定URL的合法性。我已经为此创建了自己的算法,但现在我想将PhishTank的服务添加到我的程序中。
他们提供的服务可以直接从他们的网站查询网址,但他们已经为您每天可以进行的查询数量设置了一定的配额。我选择的另一个选择是简单地下载他们的数据库并在本地使用它,没有任何限制。
你得到的文件是XML,并找到了一些要测试的代码,但似乎他们的XML包含CDATA内部的非法字符(例如unicode 0x07 - [BEL]字符),因此解析会引发我的注意例外。
<url><![CDATA[http://shaghaf-edu.com/sign-in/??msg=InvalidOnlineIdException&id[BEL]da9ca9b23227a572d1fb5ff4ff91e3&lpOlbResetErrorCounter=0l=&request_locale=en-us]]></url>
我已经做了一些搜索,我发现的所有解决方案对于相当小的XML文件来说都很好。与我合作的人接近270万行 - 我不确定正则表达式在这种情况下的效率或char-to-char比较效率。
我应该注意他们的数据库每小时更新一次,并且必须重新加载。因此,手动清理文件不是一个选择。
所以我想知道是否有任何快速有效的方法来解决这个问题?
我没有准确的代码,但我使用的是一个非常小的变体,我在StackOverflow上找到了这个:
private void start() throws Exception
{
URL url = new URL("http://localhost:8080/AutoLogin/resource/web.xml");
URLConnection connection = url.openConnection();
Document doc = parseXML(connection.getInputStream());
NodeList descNodes = doc.getElementsByTagName("description");
for(int i=0; i<descNodes.getLength();i++)
{
System.out.println(descNodes.item(i).getTextContent());
}
}
private Document parseXML(InputStream stream)
throws Exception
{
DocumentBuilderFactory objDocumentBuilderFactory = null;
DocumentBuilder objDocumentBuilder = null;
Document doc = null;
try
{
objDocumentBuilderFactory = DocumentBuilderFactory.newInstance();
objDocumentBuilder = objDocumentBuilderFactory.newDocumentBuilder();
doc = objDocumentBuilder.parse(stream);
}
catch(Exception ex)
{
throw ex;
}
return doc;
}
答案 0 :(得分:0)
通过提问来回答......
为什么不写一个简单的预处理实用程序?
它可以按原样读取XML文件(逐行);并做任何将内容转换为“正确”XML所需的内容。
换句话说:您应该明确区分“准备输入”和“实际处理xml输入”的任务。这也将使更多更容易进行微调。如果你发现正则表达式过于昂贵;然后只需更改“预处理器”即可使用它们。然后,轻松测量对运行时间的影响...