为了账号安全,请及时绑定邮箱和手机立即绑定

JAXB:在解组XML文档期间如何忽略名称空间?

JAXB:在解组XML文档期间如何忽略名称空间?

动漫人物 2019-10-08 15:29:42
我的架构指定了一个名称空间,但是文档没有。在JAXB解组(XML->对象)期间忽略名称空间的最简单方法是什么?换句话说,我有<foo><bar></bar></foo>代替,<foo xmlns="http://tempuri.org/"><bar></bar></foo>
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

我相信您必须将名称空间添加到xml文档中,例如,使用SAX过滤器。


这意味着:


用新类定义一个ContentHandler接口,该接口将在JAXB获取它们之前拦截SAX事件。

定义一个XMLReader,它将设置内容处理程序

然后将两者链接在一起:


public static Object unmarshallWithFilter(Unmarshaller unmarshaller,

java.io.File source) throws FileNotFoundException, JAXBException 

{

    FileReader fr = null;

    try {

        fr = new FileReader(source);

        XMLReader reader = new NamespaceFilterXMLReader();

        InputSource is = new InputSource(fr);

        SAXSource ss = new SAXSource(reader, is);

        return unmarshaller.unmarshal(ss);

    } catch (SAXException e) {

        //not technically a jaxb exception, but close enough

        throw new JAXBException(e);

    } catch (ParserConfigurationException e) {

        //not technically a jaxb exception, but close enough

        throw new JAXBException(e);

    } finally {

        FileUtil.close(fr); //replace with this some safe close method you have

    }

}


查看完整回答
反对 回复 2019-10-08
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

我在XMLFilter解决方案中遇到编码问题,因此我使XMLStreamReader忽略名称空间:


class XMLReaderWithoutNamespace extends StreamReaderDelegate {

    public XMLReaderWithoutNamespace(XMLStreamReader reader) {

      super(reader);

    }

    @Override

    public String getAttributeNamespace(int arg0) {

      return "";

    }

    @Override

    public String getNamespaceURI() {

      return "";

    }

}


InputStream is = new FileInputStream(name);

XMLStreamReader xsr = XMLInputFactory.newFactory().createXMLStreamReader(is);

XMLReaderWithoutNamespace xr = new XMLReaderWithoutNamespace(xsr);

Unmarshaller um = jc.createUnmarshaller();

Object res = um.unmarshal(xr);


查看完整回答
反对 回复 2019-10-08
  • 3 回答
  • 0 关注
  • 750 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信