当前位置: 首页 > 知识库问答 >
问题:

针对XML模式的通用XML文件验证程序(XSD文件)

左丘昊天
2023-03-14

我想用JAXB创建一个通用的xmlFileValidator,它需要一个XML文件和一个模式文件,如果文件有效,则返回根类的对象,否则抛出SAXExc0019或JAXBExc0019。

public class XmlValidateEventHandler implements ValidationEventHandler {
public static <E> void validator(File xsdFile, File xmlFile, E obj) throws SAXException, JAXBException
{
    JAXBContext jaxbcontextobj = JaxbUtil.create_context_obj(new ObjectFactory());
    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = sf.newSchema(xsdFile);
    Unmarshaller unmarshaller = JaxbUtil.create_unmarshl_obj(jaxbcontextobj);

    unmarshaller.setSchema(schema);
    unmarshaller.setEventHandler(new XmlValidateEventHandler());        
    javax.xml.bind.JAXBElement<Document>  doc = (javax.xml.bind.JAXBElement<Document>) unmarshaller.unmarshal(xmlFile);
    Document d = doc.getValue();
    obj=(E)d;
}

@Override
public boolean handleEvent(ValidationEvent event) {

    Logger logger = utility.JaxbUtil.getLogger();
    if(event.getSeverity() == ValidationEvent.ERROR || event.getSeverity() == ValidationEvent.FATAL_ERROR)
    {                           
        //Logger logger = Logger.getLogger(XmlValidateEventHandler.class);              
        logger.error("SEVERITY:  " + event.getSeverity());          
        logger.error("MESSAGE:  " + event.getMessage());            
        logger.error("LINKED EXCEPTION:  " + event.getLinkedException());           
        logger.error("LINE NUMBER:  " + event.getLocator().getLineNumber());
        logger.error("COLUMN NUMBER:  " + event.getLocator().getColumnNumber());
        logger.error("***** Give XML is invalid aginst given XSD *****");
        return false;
    }   
}

}

下一行给出警告-

类型安全性:未选中从对象到JAXBElement的强制转换

javax.xml.bind.JAXBElement<Document>  doc=(javax.xml.bind.JAXBElement<Document>) unmarshaller.unmarshal(xmlFile);

而且我也无法映射未签名的对象并将其设置为E obj,这是在参数中传递的。我知道它可以返回,但我被要求将其设置为该参数。请帮忙。提前谢谢

共有1个答案

方飞白
2023-03-14

我改为以下和它的工作原理:

    public static <E> E validator(File xsdFile, File xmlFile, E obj) throws SAXException, JAXBException
{   
    JAXBContext jaxbcontextobj = JaxbUtil.setContextObj(new ObjectFactory());
    SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = sf.newSchema(xsdFile);
    Unmarshaller unmarshaller = JaxbUtil.setUnmarshlObj(jaxbcontextobj);

    unmarshaller.setSchema(schema);
    unmarshaller.setEventHandler(new XmlValidateEventHandler());        
    javax.xml.bind.JAXBElement<E>  doc = (javax.xml.bind.JAXBElement<E>) unmarshaller.unmarshal(xmlFile);
    E d = (E) doc.getValue();
    return d;
}

但是现在仍然有开放的结局: 1.我仍然无法将对象映射到第三个参数-

导入XML类。目标工厂;

这仍然使它不是完全通用的,如何使用通用的ObjectFactory??

 类似资料:
  • 问题内容: 我需要使用给定的XSD文件验证XML文件。我只需要如果验证正常就返回true,否则返回false的方法。 问题答案: 仅返回true或false(也不需要任何外部库):

  • 问题内容: 我有一个XML文件,并且有一个XML模式。我想针对该架构验证文件,并检查其是否符合该架构。我正在使用python,但是如果python中没有这样有用的库,则可以使用任何语言。 我在这里最好的选择是什么?我会担心如何快速启动和运行它。 问题答案: 绝对可以。 使用预定义的架构定义,加载文件并捕获任何XML架构错误: 关于编码的注意事项 如果模式文件包含带有编码(例如)的xml标记,则上面

  • 我需要针对给定的XSD文件验证多个XML文件。问题是XSD由两个文件组成。它们是嵌套的,尽管我知道哪个是第一个(其他文件的“父”)。在XML文件中,我使用命名空间来定义子节点在哪个XSD中定义

  • 我有一个servlet,它使用打包在.jar存档中的实用程序: 此实用工具获取xml文件流,针对xsd模式执行验证并解析它: xsd文件以: xml文件: Servlet Init方法抛出异常: 如何指定SAXParser在哪里需要xsd模式来验证xml文件? 附注。对不起,我的英语不好 UPD: 我正在尝试添加此属性: UPD2:在xml文件中使用“classpath:appcontext.xs

  • 我的目标是读取CSV文件,将其转换为XML,并根据XSD对其进行验证。代码如下: 错误: 线程“main”组织中出现异常。阿帕奇。骆驼FailedToCreateRouteException:无法在以下位置创建路由1: 此外,我还想配置如果XML对给定的XSD无效,是否会发生异常。我们如何配置它? 请好心帮忙。