gpt4 book ai didi

jaxb - JAXB 有多灵活?

转载 作者:行者123 更新时间:2023-12-02 05:16:05 37 4
gpt4 key购买 nike

我正在考虑使用 JAXB 进行 XML 解析,但到目前为止我遇到了一些问题,这让我相信它可能不够灵活,无法满足我的需求。

我将解析第三方提供的 XML 以符合我将发布的 XSD。所以我想足够灵活地处理没有命名空间或指定旧版本命名空间并且实际上可能包含无效元素的文件。

JAXB 是否可以实现这种灵 active ?目前,如果未提供 namespace ,它无法解析。

最佳答案

How flexible is JAXB?

非常

So I want to be flexible enough to handle files that don't have namespaces or specify an old version of the namespace and may in fact contain invalid elements.

命名空间过滤器

下面是一个 SAX XmlFilter,可用于应用缺少的命名空间。

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);
}

}

演示

下面是一个示例,说明如何将 SAX XMLFilter 与 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();
}

}

了解更多信息

关于jaxb - JAXB 有多灵活?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14609597/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com