Tôi đang sao chép mã từ một phần của ứng dụng (applet) vào bên trong ứng dụng. Tôi đang phân tích cú pháp XML dưới dạng Chuỗi. Đã một thời gian kể từ khi tôi phân tích cú pháp XML, nhưng từ lỗi được ném, có vẻ như nó có thể liên quan đến việc không tìm thấy .dtd. Stack trace làm cho nó khó khăn để tìm ra nguyên nhân chính xác của lỗi này, nhưng đây là thông điệp:Tại sao tôi nhận được "MalformedURLException: không có giao thức" khi sử dụng SAXParser?
java.net.MalformedURLException: no protocol: <a href="http://www.mycomp.com/MyComp.dtd">http://www.mycomp.com/MyComp.dtd</a>
và XML có này là vài dòng đầu tiên:
<?xml version='1.0'?>
<!DOCTYPE MYTHING SYSTEM '<a href="http://www.mycomp.com/MyComp.dtd">http://www.mycomp.com/MyComp.dtd</a>'>
và đây là mã có liên quan snippets
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);
}
}
}
Dường như các lỗi đang xảy ra trong phương pháp preparseString(), trên dòng thực hiện các phân tích, dòng m_SaxParser.parse(lSource, this);
.
FYI, tệp 'MyComp.dtd' không tồn tại ở vị trí đó và có thể truy cập qua http. Tệp XML xuất phát từ một dịch vụ khác trên máy chủ, vì vậy tôi không thể thay đổi nó thành định dạng tệp: // và đặt tệp .dtd trên đường dẫn lớp.
Cảm ơn đã phản ứng nhanh chóng. Tôi nghĩ đây là câu trả lời hoàn chỉnh hơn với thẻ DOCTYPE đã được sửa hoàn chỉnh. Vui lòng xem câu hỏi của tôi ở trên về khả năng bỏ qua thẻ DOCTYPE này vì tôi nhận được từ một nguồn bên ngoài. – user26270
cảm ơn câu trả lời nhanh chóng – user26270
Bạn có thể đặt Giản đồ trên SAXParserFactory thành một lược đồ được tạo từ liên kết http. Tôi sẽ đăng chỉnh sửa lên câu trả lời ở trên. –