2017-12-14 6 views
0

XMLStreamReaderを使用してネストされたXMLファイルをアンマーシャルしようとしています。私は、次のようなクラスを作成しているXSDを使用しないXMLStreamReaderを使用した複雑なネストされたXMLファイルのアンマーシャリング

<?xml version="1.0" encoding="UTF-8"?> 
<tns:Envelope 
    xmlns:tns="http://www.w3.org/2003/05/soap-envelope-dial" 
    xmlns:lmic="http://www.example.com" 
    xmlns:producer="http://example1.com/" 
    xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" 
    xmlns:ns5="http://www.example.com/dial/3/0"> 
<tns:header> 
... 
... 
</tns:header> 
<tns:body> 
<producer:Producer id="1234"> 
    <producer:GenParty> 
    <producer:NameInfo> 
     <producer:Comm> 
      <producer:SuppName>DATA</producer:SuppName> 
      <producer:ContractNumber>123456</producer:ContractNumber> 
     </producer:Comm> 
    </producer:NameInfo> 
    <producer:Address> 
     <Street>ABC</Street> 
     <Country>DEF</Country> 
     ... 
     ... 
    </prodcer:Address> 
    <producer:Address> 
     <Street>ABC</Street> 
     <Country>DEF</Country> 
     ... 
     ... 
    </prodcer:Address> 
    </producer:GenParty> 
</producer:Producer> 
</tns:body> 
</tns:emvelope> 

@XmlRootElement(name="Producer",namespace="http://example.com/") 
@XmlAccessorType(XmlAccessType.FIELD) 
Class Producer { 
    private GenParty; 
    // getter method of class GenParty 
    // setter method of class GenParty 
} 

@XmlRootElement(name="GenParty") 
@XmlAccessorType(XmlAccessType.FIELD) 
class GenParty { 
    private NameInfo; 
    private List<Address> address; 
    //getter of both fields 
    // setter of both fields 
} 

を、後続のクラスが定義されています私のXMLファイルは、次のようになります。

私はタグに進めるためにXMLStreamReaderを使用していますし、私のように私のunmarshalerコードを書いています:

JAXBContext jc = JAXBContext.newInstance(Producer.class); 
Unmarshaller unmarshaller = jc.createUnmarshaller();     
Producer producer = unmarshaller.unmarshal(xsr,Producer.class).getValue(); 

しかし、私はプロデューサーのオブジェクト上に設定され、ヌル値を取得しています。私が間違っていることは何ですか?私は単純なXMLファイルを非整列化することができましたが、このレベルのネストは私にとって問題を作り出しています。誰かがそれをやり直すことを提案してもらえますか、私のコードスケルトンで何か変更を加えるべきですか?

ありがとうございます!

+0

JAXBの名前空間が間違っているためですか? –

+0

あなたのXMLは 'xmlns:producer =" http://example1.com/ "という名前空間を使いますが、Producerクラスは' namespace = "http://example.com/" ' –

答えて

0

あなたが間違っていることを言うのは少し難しいです。しかし、コード内にProducerを作成してから、すべてのクラスが正常かどうかチェックするためにマーシャリングおよびアンマーシャリングを行うことをお勧めします。

クラスが正常で、マーシャリング/アンマーシャリングが機能する場合、producer変数は決してnullにはなりません。あなたは、Java 8でこのコードを実行する場合は、任意の例外をスローしません

import com.sun.xml.internal.ws.streaming.DOMStreamReader; 
import org.w3c.dom.Document; 
import org.xml.sax.SAXException; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.stream.XMLStreamReader; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.StringWriter; 
import java.util.List; 

public class JAXBTester { 

    public static void main(String[] args) throws JAXBException, ParserConfigurationException, IOException, SAXException { 
     JAXBContext jc = JAXBContext.newInstance(Producer.class); 
     Marshaller marshaller = jc.createMarshaller(); 
     Producer producer = createProducer(); 
     String producerStr = marshalproducer(marshaller, producer); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     factory.setNamespaceAware(true); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document document = builder.parse(new ByteArrayInputStream(producerStr.getBytes("UTF-8"))); 
     XMLStreamReader xmlStreamReader = new DOMStreamReader(document); 
     Producer readProducer = unmarshaller.unmarshal(xmlStreamReader, Producer.class).getValue(); 
     if (readProducer == null) { 
      throw new IllegalStateException(); 
     } 
    } 

    private static String marshalproducer(Marshaller marshaller, Producer producer) throws JAXBException { 
     StringWriter writer = new StringWriter(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
     marshaller.marshal(producer, writer); 
     String res = writer.toString(); 
     System.out.println(res); 
     return res; 
    } 

    private static Producer createProducer() { 
     Producer producer = new Producer(); 
     GenParty genParty = new GenParty(); 
     producer.setGenParty(genParty); 
     NameInfo nameInfo = new NameInfo(); 
     nameInfo.setInfo("Foo"); 
     genParty.setNameInfo(nameInfo); 
     return producer; 
    } 

} 

@XmlRootElement(name = "Producer", namespace = "http://example.com/") 
@XmlAccessorType(XmlAccessType.FIELD) 
class Producer { 
    private GenParty genParty; 

    public GenParty getGenParty() { 
     return genParty; 
    } 

    public void setGenParty(GenParty genParty) { 
     this.genParty = genParty; 
    } 
} 

@XmlRootElement(name = "GenParty") 
@XmlAccessorType(XmlAccessType.FIELD) 
class GenParty { 
    private NameInfo nameInfo; 
    private List<Address> address; 

    public NameInfo getNameInfo() { 
     return nameInfo; 
    } 

    public void setNameInfo(NameInfo nameInfo) { 
     this.nameInfo = nameInfo; 
    } 

    public List<Address> getAddress() { 
     return address; 
    } 

    public void setAddress(List<Address> address) { 
     this.address = address; 
    } 
} 

class NameInfo { 
    private String info; 

    public String getInfo() { 
     return info; 
    } 

    public void setInfo(String info) { 
     this.info = info; 
    } 
} 

class Address { 

    private String street; 

    public String getStreet() { 
     return street; 
    } 

    public void setStreet(String street) { 
     this.street = street; 
    } 
} 

:ここ

は、この演習は次のようにどのように見えるかの例です。

関連する問題