XML中的非法字符 - java

时间:2015-07-01 10:10:23

标签: java xml parsing

我正在创建一个程序来检查给定URL的合法性。我已经为此创建了自己的算法,但现在我想将PhishTank的服务添加到我的程序中。

他们提供的服务可以直接从他们的网站查询网址,但他们已经为您每天可以进行的查询数量设置了一定的配额。我选择的另一个选择是简单地下载他们的数据库并在本地使用它,没有任何限制。

你得到的文件是XML,并找到了一些要测试的代码,但似乎他们的XML包含CDATA内部的非法字符(例如unicode 0x07 - [BEL]字符),因此解析会引发我的注意例外。

<url><![CDATA[http://shaghaf-edu.com/sign-in/??msg=InvalidOnlineIdException&amp;id[BEL]da9ca9b23227a572d1fb5ff4ff91e3&amp;lpOlbResetErrorCounter=0l=&amp;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;
}

1 个答案:

答案 0 :(得分:0)

通过提问来回答......

为什么不写一个简单的预处理实用程序?

它可以按原样读取XML文件(逐行);并做任何将内容转换为“正确”XML所需的内容。

换句话说:您应该明确区分“准备输入”和“实际处理xml输入”的任务。这也将使更多更容易进行微调。如果你发现正则表达式过于昂贵;然后只需更改“预处理器”即可使用它们。然后,轻松测量对运行时间的影响...