这个问题适用于JAXB Namespace上的Mr.Blaise Doughan
我有情况,
拥有sample.xsd(旧版本 - 无命名空间)。使用XJC为同一XSD文件生成JAXB类。我有一个例子,它使用JAXB类来解组基于XSD的XML数据文件。 sample.xsd文件已更改(新版本 - 添加了命名空间)。再次使用XJC为新的XSD文件生成JAXB类。示例已更新,现在它可以用于新的XSD文件
现在我遇到了一种情况,我在这里获得了基于旧XSD的XML数据文件,我想使用更新的示例文件来解组旧的XML数据。
我可以看到一个解决方案,生成两个带有命名空间的对象工厂,一个没有命名空间。我们可以这样做吗?如果是这样,我可以根据我获得的XML数据使用适当的对象工厂。
或者想知道,如何为两个XSD文件生成JAXB类,但是XJC没有生成,它显示错误 - 在架构或绑定文件中没有检测到更改 - 跳过源生成。
我可以在新的Object Factory上创建一个包装器,以便它可以同时处理它们吗?
请为我提供一些解决方案,以便我可以使用新的JAXB类解组旧文件。可以
答案 0 :(得分:1)
如果输入XML没有命名空间,您可以利用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);
}
}
利用JAXB的UnmarshallerHandler
作为ContentHandler
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();
// Marshal the Customer object back to XML
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
}
}