2011-03-08 49 views
4

我有一个maven库项目,它有一些类来处理xml消息。每当我收到这些消息之一,我使用我写的xml模式文件进行验证。这的确验证了我的代码看起来是这样的:如何在servlet上下文中从jar文件中读取xml架构

public static Document parseXML(final String xml) throws JDOMException, IOException { 
    SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser", true); 
    builder.setFeature("http://apache.org/xml/features/validation/schema", true); 
    URL location = CMPMessage.getClass().getResource(XML_SCHEMA_LOCATION); 
    if (null == location) { 
     throw new IOException("Unable to load schema definition file."); 
    } 
    builder.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation", 
      "http://www.mycompany.de/MyProtocol " + location); 
    return builder.build(new StringReader(xml)); 
} 

XML_SCHEMA_LOCATION是这样的:

private static final String XML_SCHEMA_LOCATION = "/ConvertMessageProtocol.xsd"; 

的.xsd文件是在src/main/resources,而且由于Maven的时候,一切都运行完美:该当告诉maven制作一个包时.xsd文件包含在.jar中。 我做了一个简单的测试项目来检查.xsd文件是否真的被找到。源代码如下:

import java.io.IOException; 
import org.jdom.JDOMException; 
import de.mycomp.MyMessage; 


public class Main { 
    public static void main(final String[] args) { 
     try { 
      MyMessage.parseXML(args[0]); 
     } 
     catch (JDOMException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

是的,xml将使用模式文件进行验证。

现在,这里说到:我想用我的小图书馆在一个servlet(在Tomcat中运行),但在那里,.xsd文件无法找到:(

当然,我可以存储。 xsd文件直接在公司服务器上,并通过http检索它,但我认为将它包含在.jar中是确保库和图表版本合适的更好解决方案。

您有任何想法这里有什么问题

在此先感谢:

吉姆

回答

4

分配

private static final String XML_SCHEMA_LOCATION = getPath("/ConvertMessageProtocol.xsd"); 

public static String getPath(String path){ 
    return UtilityClass.class.getResource(path).toString(); 
} 

的问题是你的servlet应用程序在/寻找文件不存在的文件。

+0

非常感谢您的快速回答。但是我不理解它,或者我没有明确说明: “XML_SCHEMA_LOCATION”和对“getResource”的调用都在同一个“MyMessage”类中。 – sne11ius 2011-03-08 13:13:21

+0

在您的jar文件中,您正在使用'private static final String XML_SCHEMA_LOCATION =“/ConvertMessageProtocol.xsd”从'/'读取配置文件;'现在您已将该jar添加到您的web应用程序中,因此现在'/'不会是同样你需要把它当作资源。或者使用上面提到的方法,或者只是用'private static final String XML_SCHEMA_LOCATION =“/ConvertMessageProtocol.xsd”;'替换''classpath:ConvertMessageProtocol.xsd“;' – 2011-03-08 13:19:48

+0

是的,非常感谢你,我试了几个小时才找到解决这个问题。 我尝试了第一个getPath方法,它的工作原理。 – sne11ius 2011-03-08 13:31:37