我正在從我們的應用程序的一部分(一個小程序)到應用程序內部複製代碼。我將XML解析爲字符串。自從我解析XML以來已經有一段時間了,但是從拋出的錯誤看來,它可能與找不到.dtd有關。堆棧跟蹤使得它很難找到錯誤的確切原因,但這裏的消息:爲什麼在使用SAXParser時會出現「MalformedURLException:no protocol」?
java.net.MalformedURLException: no protocol: <a href="http://www.mycomp.com/MyComp.dtd">http://www.mycomp.com/MyComp.dtd</a>
和XML有這個作爲第一個兩行:
<?xml version='1.0'?>
<!DOCTYPE MYTHING SYSTEM '<a href="http://www.mycomp.com/MyComp.dtd">http://www.mycomp.com/MyComp.dtd</a>'>
和這裏的相關代碼網頁摘要
class XMLImportParser extends DefaultHandler {
private SAXParser m_SaxParser = null;
private String is_InputString = "";
XMLImportParser(String xmlStr) throws SAXException, IOException {
super();
is_InputString = xmlStr;
createParser();
try {
preparseString();
parseString(is_InputString);
} catch (Exception e) {
throw new SAXException(e); //"Import Error : "+e.getMessage());
}
}
void createParser() throws SAXException {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
try {
factory.setFeature("http://xml.org/sax/features/namespaces", true);
factory.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
m_SaxParser = factory.newSAXParser();
m_SaxParser.getXMLReader().setFeature("http://xml.org/sax/features/namespaces", true);
m_SaxParser.getXMLReader().setFeature("http://xml.org/sax/features/namespace-prefixes", true);
} catch (SAXNotRecognizedException snre){
throw new SAXException("Failed to create XML parser");
} catch (SAXNotSupportedException snse) {
throw new SAXException("Failed to create XML parser");
} catch (Exception ex) {
throw new SAXException(ex);
}
}
void preparseString() throws SAXException {
try {
InputSource lSource = new InputSource(new StringReader(is_InputString));
lSource.setEncoding("UTF-8");
m_SaxParser.parse(lSource, this);
} catch (Exception ex) {
throw new SAXException(ex);
}
}
}
它看起來像錯誤是在preparseString()方法中發生的事情,在實際執行解析線,m_SaxParser.parse(lSource, this);
線。
僅供參考,'MyComp.dtd'文件確實存在於該位置並可通過http訪問。 XML文件來自服務器上的其他服務器,因此我無法將其更改爲file://格式,並將.dtd文件放在類路徑中。
感謝您的快速反應。我認爲這是完整的DOCTYPE標籤更完整的答案。請看我上面的問題,關於忽略這個DOCTYPE標籤的可能性,因爲我從外部獲取它。 – user26270 2010-09-09 14:47:12
感謝您的快速解答 – user26270 2010-09-09 15:09:17
您可以將SAXParserFactory上的Schema設置爲從http鏈接創建的Schema。我會在上面的答案上發佈一個修改。 – 2010-09-09 15:12:52