1 /** 2 * 解析xml(忽略命名空间) 3 * 4 * @param cla 5 * @param content 6 * @return 7 * @throws JAXBException 8 * @throws ParserConfigurationException 9 * @throws SAXException 10 */ 11 public static Object unmarshall(Class<?> cla, String content) throws JAXBException, ParserConfigurationException, SAXException { 12 13 JAXBContext jaxbContext = JAXBContext.newInstance(cla); 14 Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 15 StringReader reader = new StringReader(content); 16 17 SAXParserFactory sax = SAXParserFactory.newInstance(); 18 sax.setNamespaceAware(false); 19 XMLReader xmlReader = sax.newSAXParser().getXMLReader(); 20 21 Source source = new SAXSource(xmlReader, new InputSource(reader)); 22 Object o = unmarshaller.unmarshal(source); 23 24 return o; 25 }
先贴上代码
由于各种原因,很多特殊行业的自定义标准命名空间的URL访问不了,从而导致了Jaxb在将XML内容转换成JavaBean的时候,获取命名错误,而无法解析成功!
另一种情况,在XML中的节点属性中出现xsi:type、xml:lang等属性性,要求需要节点对应的对象要与设置的类型进行匹配,原本这是严格匹配XML节点格式的行为,是不错的方式;但在实际的操作中,这大大增加了数据模型,尤其是超大型数据模型的制作复杂程序,希望可以仅将节点与JavaBean进行匹配,相应的数据能填充到数据模型中就好
设置
SAXParserFactory.setNamespaceAware(false);
即可在转换时,忽略命名空间读取,忽略类型检查,完成数据转换