gpt4 book ai didi

namespaces - JAXB 命名空间问题

转载 作者:行者123 更新时间:2023-12-04 16:56:19 27 4
gpt4 key购买 nike

这个问题是针对 JAXB 命名空间的 Mr.Blaise Doughan

我有这样的情况,

有一个 sample.xsd(旧版本 - 没有命名空间)。使用 XJC 为同一个 XSD 文件生成 JAXB 类。我得到了一个基于 XSD 使用 JAXB 类解码 XML 数据文件的示例。
sample.xsd 文件已更改(新版本 - 添加了命名空间)。再次使用 XJC 为新的 XSD 文件生成 JAXB 类。示例已更新,现在可以用于新的 XSD 文件

现在我遇到了一种情况,我正在获取基于旧 XSD 的 XML 数据文件,我想使用更新的示例文件来解码旧的 XML 数据。

我能看到的一种解决方案,生成两个对象工厂,一个带有命名空间,一个没有命名空间。我们可以这样做吗?如果是这样,我可以根据我获得的 XML 数据使用适当的对象工厂。

或者想知道,如何为两个 XSD 文件生成 JAXB 类,但 XJC 没有生成,它显示错误 - 在架构或绑定(bind)文件中未检测到更改 - 跳过源代码生成。

我可以在新的对象工厂上创建一个包装器,以便它可以同时处理两者吗?

请为我提供一些解决方案,以便我可以使用新的 JAXB 类解码旧文件。能

最佳答案

应用命名空间

在输入 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);
}

}

想要查询更多的信息
  • http://blog.bdoughan.com/2012/11/applying-namespace-during-jaxb-unmarshal.html
  • 关于namespaces - JAXB 命名空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23234662/

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