使用JAXB解组XML时的异常



我在通过JAXB读取XML文件和基于xsd生成对象时遇到了一个问题。我不知道我做错了什么。

我已经看到了同样错误的问题,但不幸的是没有解决方案建议帮助我。

关于我的系统Macbook M1Intellij idea UltimateOpenjdk 19

谢谢你的帮助。

这是你所需要的

代码
public Aufgabe4(String path) throws JAXBException {
File f = new File(path);
JAXBContext context = JAXBContext.newInstance("generated");
Unmarshaller unmarshaller = context.createUnmarshaller();
InvoiceList invoiceList = (InvoiceList) JAXBIntrospector.getValue(
unmarshaller.unmarshal(f));
}

异常

Exception in thread "main" jakarta.xml.bind.UnmarshalException: 
unexpected element (URI:"my.namespace/Invoices", lokal:"invoice-list"). Expected elements are (none)
at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:693)
at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.reportError(Loader.java:230)
at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.reportError(Loader.java:225)
at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:92)
at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1098)
at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:527)
at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:509)
at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137)
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:518)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3079)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:836)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:542)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:889)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:825)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1224)
at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:637)
at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:218)
at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:189)
at jakarta.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:146)
at jakarta.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:188)
at jakarta.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:172)
at Aufgabe4.<init>(Aufgabe4.java:23)
at Aufgabe4.main(Aufgabe4.java:15)
Process finished with exit code 1

XSD: https://pastebin.com/vPkqH75kXML: https://pastebin.com/hiR3cjsy

如果这个问题解决了,那就太好了。

解决方案

通过JAXB读取XML文件和基于XSD生成的对象。

JAXB使用使用它的XJC从XML Schema文件生成Java类编译器。该解决方案使用Maven项目调用XJC使用hisrc-higherjaxb-maven-plugin.

这是一个名为Invoices的Maven项目使用标准文件布局。本项目包括:

  • XML Schema文件发票。Invoice模型的xsd
  • 用于解组的XML示例文件Invoices01-1.xml
  • JAXB绑定文件发票。xjb用于配置
  • 一个JUnit测试类invoicest .java来验证(un)封送
  • 包含InvoiceList数据的XML示例文件
  • Maven POM文件与hisrc-higherjaxb-maven-plugin
Invoices
src
main
java
resources
Invoices.xsd
Invoices.xjb
simplelogger.properties
test
java
namespace/my/invoices/InvoicesTest.java
resources
jvmsystem.arguments
jvmsystem.properties
samples
Invoices01-1.xml
pom.xml
执行

这是一个独立的Maven项目。您可以使用以下命令运行测试:

mvn clean test
mvn compile exec:java

JAXB类是由这个插件使用这个项目的pom.xml

生成的
<plugin>
<groupId>org.patrodyne.jvnet</groupId>
<artifactId>hisrc-higherjaxb-maven-plugin</artifactId>
<version>${hisrc-higherjaxb-maven-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<args>
<arg>-no-header</arg>
<arg>-XhashCode</arg>
<arg>-Xequals</arg>
<arg>-XtoString</arg>
</args>
<plugins>
<plugin>
<groupId>org.patrodyne.jvnet</groupId>
<artifactId>hisrc-basicjaxb-plugins</artifactId>
<version>${hisrc-basicjaxb.version}</version>
</plugin>
</plugins>
</configuration>
</execution>
</executions>
</plugin>

和生成:

target/generated-sources/xjc/
namespace
└── my
└── invoices
├── AddressType.java
├── BankDetailsType.java
├── BillingInfo.java
├── BillingType.java
├── Company.java
├── ContactType.java
├── CurrencyCodesType.java
├── CurrencyType.java
├── CustomerInfo.java
├── Customer.java
├── Invoice.java
├── InvoiceList.java
├── Items.java
├── ItemType.java
├── ObjectFactory.java
├── Other.java
├── package-info.java
└── TaxesType.java

方法配置hisrc-higherjaxb-maven-plugin生成JAXB类使用提供的发票。xsd模式。模式提供JAXB的名称空间"my.namespace/Invoices"使用自己的命名约定创建Javapackage名称。

作为一个选项,可以使用这些XJC生成Java内置Object方法的更高级实现hisrc-basicjaxb-plugins。特别地,示例项目使用toString插件来显示未编组Invoice对象的人类可读的表示。

hisrc-basicjaxb-plugins

<args>
<arg>-no-header</arg>
<arg>-XhashCode</arg>
<arg>-Xequals</arg>
<arg>-XtoString</arg>
</args>

注意:,XJC如果使用了hsrc -basicjaxb-plugins,则需要在运行时类路径上使用hsrc -basicjaxb-runtime依赖项。

检测h5> JUnit测试类invoicest .java扫描示例文件,并调用方法checkSample(File sample)向测试人员提供每个文件。对于这个项目,创建了一个JAXBContext,并且示例路径中的每个文件都解封送到一个InvoiceList对象。当成功时,每个对象将被封送以进行日志记录和您的检查。

示范具有OP提供的构造函数和main(...)方法的Java标准引擎应用程序位于namespace.my.invoices.Aufgabe4

public Aufgabe4(String path) throws JAXBException
{
File f = new File(path);
JAXBContext context = JAXBContext.newInstance(ObjectFactory.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
InvoiceList invoiceList = (InvoiceList) JAXBIntrospector.getValue( unmarshaller.unmarshal(f));
setInvoices(invoiceList);
}

这个应用程序使用:

mvn compile exec:java "src/test/samples/Invoices01-1.xml"

最新更新