gpt4 book ai didi

java - JAXB 对根元素感到困惑?

转载 作者:搜寻专家 更新时间:2023-10-31 20:22:47 25 4
gpt4 key购买 nike

我正在尝试使用 Visio XML Schema 编码文件,它由 3 个模式文件组成,并在使用 XJC 生成 java 源时生成三个包:

  • com.microsoft.schemas.visio._2003.core
  • com.microsoft.schemas.visio._2006.extension
  • com.microsoft.schemas.office.visio._2010.extension

根元素是 VisioDocument,我使用的所有类都在 2003 包中。

这是我编码 XML 文件的方法:

VisioDocumentType visioDoc = new VisioDocumentType();
... manipulated here ...
JAXBContext jc = JAXBContext.newInstance("com.microsoft.schemas.visio._2003.core");
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(new JAXBElement<VisioDocumentType>(new QName("uri","local"), VisioDocumentType.class, visioDoc), bw);

执行时,我收到此错误:

javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.internal.SAXException2: unable to marshal type "com.microsoft.schemas.visio._2003.core.PagePropsType" as an element because it is missing an @XmlRootElement annotation]

我正在使用 PagePropsType,但它不是根元素。为什么 JAXB 这么认为?

最佳答案

问题出在代码的 ... manipulated here ... 部分。

基于您执行以下操作(或类似操作)的假设。

// you create a page prop
PagePropsType pageProps = ...

// then you feed it to a shape sheet
ShapeSheetType shapeSheet = ...
shapeSheet.getTextOrXFormOrLine().add(pageProps);

( ShapeSheetTypeStyleSheetType 等的父类(super class)。)

如果是这种情况,那么您的问题在于将 pageProps 直接添加到列表中。

如果您查看 getTextOrXFormOrLine() 方法的文档,它会列出该列表可以容纳的类型。每种类型都包装在 JAXBElement<...> 中,因此您必须先包装 pageProps,然后再将其添加到列表中。

你应该这样做:

ObjectFactory objectFactory = new ObjectFactory();
JAXBElement<PagePropsType> pagePropsElement = objectFactory.createShapeSheetTypePageProps(pageProps);

(请注意,我使用 XJC 2.2.4 来编译模式;对我来说,每个类的名称都以 Type 为后缀。也许这就是为什么我最终得到 VisioDocumentType 而不是像你一样的 VisioDocument 的原因,但它应该没关系。)

关于java - JAXB 对根元素感到困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8526499/

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