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中是确保库和图表版本合适的更好解决方案。
您有任何想法这里有什么问题
在此先感谢:
吉姆
非常感谢您的快速回答。但是我不理解它,或者我没有明确说明: “XML_SCHEMA_LOCATION”和对“getResource”的调用都在同一个“MyMessage”类中。 – sne11ius 2011-03-08 13:13:21
在您的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
是的,非常感谢你,我试了几个小时才找到解决这个问题。 我尝试了第一个getPath方法,它的工作原理。 – sne11ius 2011-03-08 13:31:37