2017-06-08 2 views
1

は、私はこのXML持ちながら、接頭辞を無視:アンマーシャリングのXML

<?xml version="1.0" encoding="UTF-8"?> 
<s:XXMsg xmlns:s="com:sample:test:msg"> 
    <s:Header> 
     <s:cpyCod>xxx</s:cpyCod> 
     <s:appCod>yyy</s:appCod> 
    </s:Header> 
</s:XXMsg> 

を、私は、これは次のJavaクラスに非整列化したい:

public class XXHeader 
{ 
    private String cpyCod; 
    private String appCod; 
} 

私はこのコードを書いた:

XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
    inputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, true); 
    try 
    { 
     XMLStreamReader streamReader = inputFactory 
      .createXMLStreamReader(Test.class.getClassLoader().getResourceAsStream("xxmsg.xml")); 
     while (streamReader.hasNext()) 
     { 
      int next = streamReader.next(); 
      if (streamReader.getEventType() == XMLStreamReader.START_ELEMENT 
       && streamReader.getLocalName().equals("Header")) 
      { 
       JAXBContext context = JAXBContext.newInstance(XXHeader.class); 
       Unmarshaller unmarshaller = context.createUnmarshaller(); 
       XXHeader xxHeader = unmarshaller.unmarshal(streamReader, XXHeader.class).getValue(); 
       System.out.println(xxHeader); 
       break; 
      } 
     } 

フィールド値はすべてです0としてnullとなります。しかし、私がxmlを変更してすべての要素のプレフィックスs:を削除すると、正しい値が得られます。

正しい値を取得するために非整列化中にこの接頭辞を無視するにはどうすればよいですか?

PS:@XML**注釈の使用は、XXHeaderクラスではお勧めできません。

答えて

1

私はhere述べたようにStreamReaderDelegateを使用してこれを行うことができる午前:

public class XXHeaderXMLReader 
    extends StreamReaderDelegate 
{ 

    public SBIsoHeaderXMLReader(XMLStreamReader paramXMLStreamReader) 
    { 
     super(paramXMLStreamReader); 
    } 

    @Override 
    public String getAttributeNamespace(int paramInt) 
    { 
     return ""; 
    } 

    @Override 
    public String getNamespaceURI() 
    { 
     return ""; 
    } 

} 

と前のコードの行を追加:リンクを共有するための

XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
inputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, true); 
try 
{ 
    XMLStreamReader streamReader = inputFactory 
     .createXMLStreamReader(DocumentTest.class.getClassLoader().getResourceAsStream("xxmsg.xml")); 
    while (streamReader.hasNext()) 
    { 
     int next = streamReader.next(); 
     if (streamReader.getEventType() == XMLStreamReader.START_ELEMENT) 
     { 
      if (streamReader.getLocalName().equals("Header")) 
      { 
       JAXBContext context = JAXBContext.newInstance(XXHeader.class); 
       Unmarshaller unmarshaller = context.createUnmarshaller(); 
       XXHeaderXMLReader xxHeaderXMLReader = new XXHeaderXMLReader(streamReader); 
       XXHeader xxHeader = 
        unmarshaller.unmarshal(xxHeaderXMLReader, SBIsoHeader.class).getValue(); 
       System.out.println(xxHeader); 
       break; 
      } 
     } 
    } 
} 
catch (XMLStreamException e) 
{ 
    e.printStackTrace(); 
} 
catch (JAXBException e) 
{ 
    e.printStackTrace(); 
} 
0

Hereあなたは名前空間を無視することについての有益な情報を見つけたり、XMLスキーマ(フィールド説明付き)を定義してcom:sample:test:msgの代わりに使用することができます。

+0

感謝。それは本当に役に立ちました。 –

関連する問題