如何从输入XML解组JAXB中的元素?

时间:2014-01-17 04:35:13

标签: xml jaxb dtd unmarshalling

在使用输入XML文档的JAXB进行unmarshal时,我遇到了一个问题。 XML文档看起来像

<?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一起使用的任何替代工作。

谢谢, 巴斯卡尔

1 个答案:

答案 0 :(得分:0)

如果您将JAXB与StAX一起使用,以下是捕获doctype信息的方法。

XMLResolver(MyXMLResolver)

以下是您可以用来捕获doctype信息的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());
    }

}