このようなベンダーが提供するXMLがあります:JAXBと名前空間のないXML
<?xml version="1.0" encoding="utf-8"?>
<Foo>
<Bar>...</Bar>
<Bar>...</Bar>
</Foo>
注そこにはxmlns="..."
宣言がされていない、またベンダーがスキーマを供給んが。これは変更できません。ベンダーは将来このようにXMLを出荷し続けます。それは要素のために使用することができるように、私は、多かれ少なかれ意味のある名前空間(「http://acme.com/schema」)を宣言した
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://acme.com/schema"
xmlns:tns="http://acme.com/schema"
elementFormDefault="qualified">
<xsd:element name="Foo">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="tns:Bar" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Bar">
...
</xsd:element>
</xsd:schema>
注:
JAXBバインディングを生成するために、私はこのようなスキーマを作成しました参考文献などXJCは以下のpackage-info.java
を生成します。
@javax.xml.bind.annotation.XmlSchema(namespace = "http://acme.com/schema", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.acme.schema;
それから私は、非整列化するXML文書にしてみてください:
JAXBContext jaxb = JAXBContext.newInstance("com.acme.schema");
Unmarshaller unmarshaller = jaxb.createUnmarshaller();
InputStream is = this.getClass().getClassLoader().getResourceAsStream("test.xml");
InputSource source = new InputSource(is);
Foo foo = (Foo) unmarshaller.unmarshal(source);
ここで私が得る例外です:JAXBクラスが空でないものを持っていながら、XML要素は、空の名前空間に属しているので、明らかに
javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"Foo"). Expected elements are <{http://acme.com/schema}Foo>,...>
、これは起こります。
XML名前空間を(おそらくXML解析中に)偽装する方法があるため、JAXBは要素を認識してそれらを正常にバインドできますか? XML文書はむしろ膨大なものになる可能性があるため、SAX/StAXソリューションはDOMよりも優先されます。
あなたは上XJCによって生成されたクラスを置くことを気にしますか? –