评估XPath随不同环境的变化

时间:2014-12-15 19:42:08

标签: java xml xpath xerces

我有一个独立的java项目,我从我的xml文件中评估XPath并给出正确的结果。 当我将源代码集成到部署在websphere 7上的应用程序时,结果不再正常。 经过验证,我发现在第一种情况(独立项目)中,Document构建良好(从根中识别出所有节点),在第二种情况下(在WS 7上部署的应用程序中添加的源代码)根节点文档中缺少。 在这两种情况下,我使用了“DocumentBuilderFactory”的相同实现,问题仍然存在。 这是我使用的代码:

    domFactory = DocumentBuilderFactory.newInstance();
    xmlContent = new byte[inputStream.available()];
    inputStream.read(xmlContent); 
    ByteArrayInputStream bais = new ByteArrayInputStream(xmlContent);
    DocumentBuilder documentBuilder = domFactory.newDocumentBuilder();
    document = documentBuilder  .parse(bais);
    xPATH = XPathFactory.newInstance().newXPath();
    transformerFactory = TransformerFactory.newInstance();
    transformer = transformerFactory.newTransformer();

DomFactory的实现是:来自jar xerces-impl.1.5的“com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl”

任何想法都会有所帮助。

1 个答案:

答案 0 :(得分:0)

InputStream.read(byte [])方法might or might not填充传递给它的数组。起初,你很幸运;仅仅因为代码工作一次并不意味着它保证每次或每个平台都能正常工作。

另一个问题是the contract of the InputStream.available() method明确指出:

  

请注意,虽然InputStream的某些实现将返回流中的总字节数,但许多实现不会。使用此方法的返回值来分配用于保存此流中所有数据的缓冲区绝对不正确。

在您的情况下,有一个非常简单的解决方案。你已经有了一个InputStream。不要把它读成字节数组;删除xmlContentbais和available()的所有用途。改为解析原始的InputStream:

DocumentBuilder documentBuilder = domFactory.newDocumentBuilder();
document = documentBuilder.parse(inputStream);
xPATH = XPathFactory.newInstance().newXPath();
transformerFactory = TransformerFactory.newInstance();
transformer = transformerFactory.newTransformer();