在使用输入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一起使用的任何替代工作。
谢谢, 巴斯卡尔
答案 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());
}
}