加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 通过转换为流式XML到JAXB Unmarshaller,具有为根元素声

发布时间:2020-12-15 02:30:50 所属栏目:Java 来源:网络整理
导读:有很多通过XSLT流式传输 XML,然后将JAXB传输到 Java对象的例子.通常他们看起来像这样: Transformer responseTransformer = TransformerFactory.newInstance().newTransformer(new StreamSource(getClass().getResourceAsStream("ResponseTransformation.xsl
有很多通过XSLT流式传输 XML,然后将JAXB传输到 Java对象的例子.通常他们看起来像这样:

Transformer responseTransformer = TransformerFactory.newInstance().newTransformer(new StreamSource(getClass().getResourceAsStream("ResponseTransformation.xsl")));
Unmarshaller jaxbUnmarshaller = JAXBContext.newInstance(ObjectFactory.class.getPackage().getName()).createUnmarshaller();

JAXBResult jaxbResult = new JAXBResult(jaxbUnmarshaller);
responseTransformer.transform(new StreamSource(new StringReader(responseXml)),jaxbResult);
res = jaxbResult.getResult();

还有像这样的声明类型的JAXB Unmarshal示例(来自Unmarshaller javadoc):

JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller u = jc.createUnmarshaller();

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File( "nosferatu.xml"));
Element  fooSubtree = ...; // traverse DOM till reach xml element foo,constrained by a 
                           // local element declaration in schema.

// FooType is the JAXB mapping of the type of local element declaration foo.
JAXBElement<FooType> foo = u.unmarshal(fooSubtree,FooType.class);

注意我们如何为u.unmarshal(fooSubtree,FooType.class)调用中的根元素指定FooType.class.尼斯.

问题是:有没有办法将流式处理方式与上面的示例相结合,并采用指定声明类型的方式,如下例所示?

我喜欢实现它的方法,但它需要访问JAXB实现类.当然可以通过公共JAXB接口来实现,对吗?

谢谢!

解决方法

您可以通过创建XMLFilter来访问unmarshaller.unmarshal(源,类型)方法.此代码将允许您运行转换并解组为未绑定到XSD中的根元素的对象:

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLFilter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.util.JAXBResult;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamSource;
import static org.apache.commons.io.IOUtils.closeQuietly;
...
InputStream transformIn = null;
InputStream sourceIn = null;

try {
  // get the transform and source streams.
  transformIn = ...;
  sourceIn = ...;

  // create the filtered source
  SAXTransformerFactory factory = (SAXTransformerFactory)TransformerFactory.newInstance();
  XMLFilter filter = factory.newXMLFilter(new StreamSource(transformIn));
  Source source = new SAXSource(filter,new InputSource(new InputStreamReader(sourceIn,"UTF-8")));

  // unmarshal the object.
  Unmarshaller jaxbUnmarshaller = 
    JAXBContext.newInstance(ObjectFactory.class.getPackage().getName()).createUnmarshaller();
  JAXBElement<FooType> foo = jaxbUnmarshaller.unmarshal(source,FooType.class);
}
finally {
  closeQuietly(transformIn);
  closeQuietly(sourceIn);
}

警告:仅仅因为您使用的是流API,并不意味着实现是流式传输.大多数XSLT处理器将在转换文档之前构建输入的DOM样式表示.如果您在解组之前尝试避免构建文档,则此代码可能不会这样做.有关处理器的更多信息,请参见this answer.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读