文字列の非整列化中にこのエラーが発生します。 JAXBを使用してJavaファイルを作成しました。
JAXBContext jaxbContext = JAXBContext.newInstance(DocumentType.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
// Input string posted below
DocumentType dType = (DocumentType) unmarshaller.unmarshal(new StringReader("input string"));
スタックトレース:
Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd", local:"document"). Expected elements are (none)
at com.Sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.Java:647)
at com.Sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.Java:243)
at com.Sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.Java:238)
at com.Sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.Java:105)
at com.Sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.Java:1048)
at com.Sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.Java:483)
at com.Sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.Java:465)
at com.Sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.Java:135)
at com.Sun.org.Apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.Java:506)
at com.Sun.org.Apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.Java:376)
at com.Sun.org.Apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.Java:602)
at com.Sun.org.Apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.Java:3065)
at com.Sun.org.Apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.Java:881)
at com.Sun.org.Apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.Java:607)
at com.Sun.org.Apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.Java:116)
at com.Sun.org.Apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.Java:489)
at com.Sun.org.Apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.Java:835)
at com.Sun.org.Apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.Java:764)
at com.Sun.org.Apache.xerces.internal.parsers.XMLParser.parse(XMLParser.Java:123)
at com.Sun.org.Apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.Java:1210)
at com.Sun.org.Apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.Java:568)
at com.Sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.Java:203)
at com.Sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.Java:175)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.Java:157)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.Java:214)
at JaxbTest.main(JaxbTest.Java:19)
XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd"
elementFormDefault="qualified">
<xs:element name="document" type="tns:documentType"></xs:element>
<xs:complexType name="documentType">
<xs:sequence>
<xs:element name="businessCard" type="tns:businessCardType" minOccurs="0" maxOccurs="1"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="businessCardType">
<xs:sequence>
<xs:element name="field" type="tns:fieldType" minOccurs="0" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fieldType">
<xs:sequence>
<xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="1">
</xs:element>
<xs:element name="characters" type="tns:charactersType" minOccurs="0" maxOccurs="1"></xs:element>
<xs:element name="fieldComponents" type="tns:fieldComponentsType" minOccurs="0" maxOccurs="1"></xs:element>
</xs:sequence>
<xs:attribute name="type" type="tns:typeType"></xs:attribute>
</xs:complexType>
<xs:simpleType name="typeType">
<xs:restriction base="xs:string">
<xs:enumeration value="Name"></xs:enumeration>
<xs:enumeration value="Phone"></xs:enumeration>
<xs:enumeration value="Mobile"></xs:enumeration>
<xs:enumeration value="Fax"></xs:enumeration>
<xs:enumeration value="Company"></xs:enumeration>
<xs:enumeration value="Job"></xs:enumeration>
<xs:enumeration value="Address"></xs:enumeration>
<xs:enumeration value="Email"></xs:enumeration>
<xs:enumeration value="Web"></xs:enumeration>
<xs:enumeration value="Text"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="charactersType">
<xs:sequence>
<xs:element name="char" type="tns:charType" minOccurs="0" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="charType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="suspicious" type="xs:boolean" use="optional"></xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="fieldComponentsType">
<xs:sequence>
<xs:element name="fieldComponent" type="tns:fieldComponentType" minOccurs="0" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fieldComponentType">
<xs:sequence>
<xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="1">
</xs:element>
</xs:sequence>
<xs:attribute name="type" type="tns:fieldComponentTypeType"></xs:attribute>
</xs:complexType>
<xs:simpleType name="fieldComponentTypeType">
<xs:restriction base="xs:string">
<xs:enumeration value="FirstName"></xs:enumeration>
<xs:enumeration value="MiddleName"></xs:enumeration>
<xs:enumeration value="LastName"></xs:enumeration>
<xs:enumeration value="ExtraName"></xs:enumeration>
<xs:enumeration value="PhonePrefix"></xs:enumeration>
<xs:enumeration value="PhoneCountryCode"></xs:enumeration>
<xs:enumeration value="PhoneCode"></xs:enumeration>
<xs:enumeration value="PhoneBody"></xs:enumeration>
<xs:enumeration value="PhoneExtension"></xs:enumeration>
<xs:enumeration value="ZipCode"></xs:enumeration>
<xs:enumeration value="Country"></xs:enumeration>
<xs:enumeration value="City"></xs:enumeration>
<xs:enumeration value="StreetAddress"></xs:enumeration>
<xs:enumeration value="JobPosition"></xs:enumeration>
<xs:enumeration value="JobDepartment"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:schema>
入力文字列:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd" xmlns="http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd">
<businessCard>
<field type="Phone">
<value>783-37-00</value>
</field>
<field type="Phone">
<value>783-37-01</value>
</field>
<field type="Fax">
<value>783-26-63</value>
</field>
<field type="Email">
<value>[email protected]</value>
</field>
<field type="Web">
<value>www.abbyy.com</value>
</field>
<field type="Address">
<value>Otradnaya str., 2b, bld.6, 127273, Moscow, Russia</value>
</field>
<field type="Name">
<value>John Smith</value>
</field>
<field type="Company">
<value>ABBYY Headquarters</value>
</field>
<field type="Job">
<value>Product Analyst</value>
</field>
<field type="Text">
<value>ABBYY ABBYY Headquarters John Smith Product Analyst ABBYY Headquarters Otradnaya str., 2b, bld.6, 127273, Moscow, Russia Tel: 783-37-00 Fax: 783-26-63 [email protected] www.abbyy.com </value>
</field>
</businessCard>
</document>
XMLスキーマからJAXBモデルを生成すると、名前付き複合型に対応するグローバル要素のメタデータは、ObjectFactory
クラスのcreateメソッドの@XmlElementDecl
注釈としてキャプチャされます。 JAXBContext
クラスのみでDocumentType
を作成しているため、このメタデータは処理されていません。 XMLスキーマからJAXBモデルを生成した場合、生成されたパッケージ名またはJAXBContext
クラスにObjectFactory
を作成して、必要なすべてのメタデータが処理されるようにする必要があります。
ソリューションの例:
JAXBContext jaxbContext = JAXBContext.newInstance(my.generatedschema.dir.ObjectFactory.class);
DocumentType documentType = ((JAXBElement<DocumentType>) jaxbContext.createUnmarshaller().unmarshal(inputStream)).getValue();
または、DocumentType
クラスの使用を継続する場合。次に、DocumentTypeクラスの上に次の注釈を追加します。
@XmlRootElement(name="document")
注:文字列値"document"
は、xmlメッセージのルートタグの名前を指します。
このエラーの理由の1つは、jdkからのjaxb実装の使用です。なぜこのような問題が非常に単純なxml解析の状況で現れるのか分かりません。パブリックMavenリポジトリから最新バージョンのjaxbライブラリを使用できます。
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.12</version>
</dependency>
この例では、以下で間違ったJavaパッケージが指定されたため、UnmarshalExceptionが発生していました。適切なパッケージが配置されると、問題は解決されました。
@Bean
public Unmarshaller tmsUnmarshaller() {
final Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller
.setPackagesToScan("Java.package.to.generated.Java.classes.for.xsd");
return jaxb2Marshaller;
}