我正在考虑使用 JAXB 进行 XML 解析,但到目前为止我遇到了几个问题,这让我相信它可能不够灵活,无法满足我的需求。
我将解析第三方提供的 XML 以符合我将发布的 XSD。因此,我希望足够灵活地处理没有命名空间的文件或指定旧版本的命名空间并且实际上可能包含无效元素。
JAXB 是否可以实现这种灵活性?目前,如果未提供命名空间,则无法解析。
我正在考虑使用 JAXB 进行 XML 解析,但到目前为止我遇到了几个问题,这让我相信它可能不够灵活,无法满足我的需求。
我将解析第三方提供的 XML 以符合我将发布的 XSD。因此,我希望足够灵活地处理没有命名空间的文件或指定旧版本的命名空间并且实际上可能包含无效元素。
JAXB 是否可以实现这种灵活性?目前,如果未提供命名空间,则无法解析。
JAXB 有多灵活?
非常
因此,我希望足够灵活地处理没有命名空间的文件或指定旧版本的命名空间并且实际上可能包含无效元素。
命名空间过滤器
下面是一个XmlFilter
可用于应用缺失名称空间的 SAX。
import org.xml.sax.*;
import org.xml.sax.helpers.XMLFilterImpl;
public class NamespaceFilter extends XMLFilterImpl {
private static final String NAMESPACE = "http://www.example.com/customer";
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(NAMESPACE, localName, qName);
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
super.startElement(NAMESPACE, localName, qName, atts);
}
}
演示
下面是如何将 SAXXMLFilter
与 JAXB 一起应用的示例。
import javax.xml.bind.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
public class Demo {
public static void main(String[] args) throws Exception {
// Create the JAXBContext
JAXBContext jc = JAXBContext.newInstance(Customer.class);
// Create the XMLFilter
XMLFilter filter = new NamespaceFilter();
// Set the parent XMLReader on the XMLFilter
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
filter.setParent(xr);
// Set UnmarshallerHandler as ContentHandler on XMLFilter
Unmarshaller unmarshaller = jc.createUnmarshaller();
UnmarshallerHandler unmarshallerHandler = unmarshaller
.getUnmarshallerHandler();
filter.setContentHandler(unmarshallerHandler);
// Parse the XML
InputSource xml = new InputSource("src/blog/namespace/sax/input.xml");
filter.parse(xml);
Customer customer = (Customer) unmarshallerHandler.getResult();
}
}
了解更多信息