2014-01-17 27 views
1

我在使用輸入XML文檔的JAXB進行解組時遇到了一個問題。該XML文檔看起來像如何從輸入XML中對JAXB中的<!DOCTYPE>元素進行解組?

<?xml version="1.0" encoding="windows-1252"?> 
<!DOCTYPE Power SYSTEM "http://someuri/TestModel_v9.dtd"> 
<Power> 
    <Data> 
    </Data> 
    <Control> 
     <Inp1>MyInp</Inp1> 
     <Inp2>MyInp</Inp2> 
    </Control> 
</Power> 

我已經生成JAXB類和能夠訪問除DOCTYPE所有的解組數據。我需要將DOCTYPE部分作爲未編組數據的一部分。我在JAXB中使用Unmarshaller.unmarshal方法。使用JAXB解組的一部分。

File file = new File("C:\\file.xml"); 
JAXBContext jaxbContext = JAXBContext.newInstance(Power.class); 

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
Power power= (Power) jaxbUnmarshaller.unmarshal(file); 

任何想法如何實現這一目標?如果JAXB無法做到這一點,請建議我可以與JAXB一起使用的替代工作。

感謝, 巴斯卡爾

回答

0

這裏是你如何捕捉DOCTYPE信息,如果您使用JAXB使用StAX。

的XmlResolver(MyXMLResolver)

這裏是XMLResolver實現你可以用它來捕捉文檔類型的信息。

import javax.xml.stream.XMLResolver; 
import javax.xml.stream.XMLStreamException; 

public class MyXMLResolver implements XMLResolver { 

    private String publicID; 
    private String systemID; 
    private String baseURI; 
    private String namespace; 

    @Override 
    public Object resolveEntity(String publicID, String systemID, 
      String baseURI, String namespace) throws XMLStreamException { 
     this.publicID = publicID; 
     this.systemID = systemID; 
     this.baseURI = baseURI; 
     this.namespace = namespace; 
     return null; 
    } 

    public String getPublicID() { 
     return publicID; 
    } 

    public String getSystemID() { 
     return systemID; 
    } 

    public String getBaseURI() { 
     return baseURI; 
    } 

    public String getNamespace() { 
     return namespace; 
    } 

} 

演示

這裏是你如何利用它在你的使用情況:

import javax.xml.bind.*; 
import javax.xml.stream.*; 
import javax.xml.transform.stream.StreamSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     XMLInputFactory xif = XMLInputFactory.newFactory(); 
     MyXMLResolver resolver = new MyXMLResolver(); 
     xif.setXMLResolver(resolver); 
     XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource("input.xml")); 

     JAXBContext jc = JAXBContext.newInstance(Power.class); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Power power = (Power) unmarshaller.unmarshal(xsr); 

     System.out.println(resolver.getPublicID()); 
     System.out.println(resolver.getSystemID()); 
     System.out.println(resolver.getBaseURI()); 
     System.out.println(resolver.getNamespace()); 
    } 

} 
相關問題