我從服務器獲取任意XML並使用此Java代碼解析它:如何使XML解析器知道所有字符實體引用?
String xmlStr; // arbitrary XML input
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(xmlStr));
return builder.parse(is);
}
catch (SAXException | IOException | ParserConfigurationException e) {
LOGGER.error("Failed to parse XML.", e);
}
在每隔一段時間,XML輸入包含像
一些未知的實體引用和失敗,出現錯誤,如org.xml.sax.SAXParseException: The entity "nbsp" was referenced, but not declared.
我可以通過預處理原始xmlStr
並在解析之前轉換所有有問題的實體引用來解決此問題。這裏是一個可行的虛擬實現:
protected static String translateEntityReferences(String xml) {
String newXml = xml;
Map<String, String> entityRefs = new HashMap<>();
entityRefs.put(" ", " ");
entityRefs.put("«", "«");
entityRefs.put("»", "»");
// ... and 250 more...
for(Entry<String, String> er : entityRefs.entrySet()) {
newXml = newXml.replace(er.getKey(), er.getValue());
}
return newXml;
}
然而,這實在是不能令人滿意的,因爲有are a huge number of entity references我不希望所有的硬編碼到我的Java類。
是否有任何簡單的方法來教導整個DocumentBuilder字符實體引用列表?
這裏你去:https://dev.w3.org/html5/html-author/charref玩得開心! –
看起來很有趣,但我如何說服我的DocumentBuilder相同呢? ;-) – dokaspar
你可以試試這個正則表達式來替換空白字符串的匹配內容。 String regexex =「&|#| [A-Za-z]?(\\ w + | \\ d +);」; Pattern pattern = Pattern.compile(regexex);否則你可以嘗試JSOUP庫。檢查鏈接[http://stackoverflow.com/questions/36026353/parsing-xml-file-containing-html-entities-in-java-without-changing-the-xml](http://stackoverflow.com/questions/36026353 /解析的XML含文件-HTML實體功能於Java的不變化的最XML)。 –