JAXB命名空间问题

时间:2014-04-23 04:20:23

标签: namespaces jaxb

这个问题适用于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类解组旧文件。可以

1 个答案:

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

}

Unmarshal

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

}

更多信息