gpt4 book ai didi

java - JAXB 检查 xml 对于声明的 xsd 是否有效

转载 作者:太空宇宙 更新时间:2023-11-04 07:06:21 25 4
gpt4 key购买 nike

在调用 Unmarshaller 的 unmarshal 方法之前,我需要知道 xml 是否有效。

现在我这样做:

JAXBContext jaxbContext = JAXBContext.newInstance("package");

final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
final File xsdFile = new File("pathtoxsd/file.xsd");
final Schema schema = schemaFactory.newSchema(xsdFile);

unmarshaller.setSchema(schema);
unmarshaller.setEventHandler(new ValidationEventHandler() {
@Override
public boolean handleEvent(ValidationEvent arg0)
{
return false;
}
});

final File xmlFile = new File("pathtoxml/fileName.xml");

final Object unmarshalled = unmarshaller.unmarshal(xmlFile);

但我不想被迫知道 xsd 在哪里。 xsd 路径只能由其中的 xml 声明,并且编码器应遵循 xml 声明的路径。

最佳答案

您可以执行以下操作:

  1. 使用 StAX 解析器解析 XML 文档。
  2. 前进到根元素。
  3. 获取 schemaLocation 属性(您可能还需要处理 noNamespaceSchemaLocation 属性)。
  4. 从该值(空格后面的部分)获取 XSD 的路径。
  5. 根据该值创建架构
  6. Unmarshaller 上设置架构
import javax.xml.XMLConstants;
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;

public class Demo {

public static void main(String[] args) throws Exception {
XMLInputFactory xif = XMLInputFactory.newFactory();
StreamSource xml = new StreamSource("src/forum21317146/input.xml");
XMLStreamReader xsr = xif.createXMLStreamReader(xml);
xsr.next();

JAXBContext jc = JAXBContext.newInstance(Foo.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();

String schemaLocation = xsr.getAttributeValue(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "schemaLocation");
if(null != schemaLocation) {
String xsd = schemaLocation.substring(schemaLocation.lastIndexOf(' ') + 1);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new StreamSource(xsd));
unmarshaller.setSchema(schema);
}

unmarshaller.unmarshal(xsr);

}

}

关于java - JAXB 检查 xml 对于声明的 xsd 是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21317146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com