2014-12-15 3 views
0

У меня есть автономный проект java, в котором я оцениваю XPath из моего xml-файла и даю правильный результат. Когда я интегрировал свой исходный код в приложение, развернутое на websphere 7, результат больше не работает. После проверки я обнаружил, что в первом случае (автономный проект) Документ хорошо построен (все узлы из корня распознаются), а во втором случае (исходный код добавлен в развернутое приложение на WS 7) корень узел отсутствует в документе. В обоих случаях я работал с той же реализацией «DocumentBuilderFactory», и проблема не устранена. Это код я использовал:Оценка изменений XPath в разных средах

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 является: "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl" из банки Xerces-impl.1.5

Любые идеи были бы полезны.

ответ

0

Метод InputStream.read (byte []) might or might not заполнит массив, переданный ему. Сначала вам повезло; просто потому, что код работал некогда, не означает, что он гарантированно будет работать каждый раз или на каждой платформе.

Другая проблема состоит в том, что the contract of the InputStream.available() method конкретно говорится:

Обратите внимание, что в то время как некоторые реализации InputStream возвращает общее число байтов в потоке, многие из них не будет. Неправильно использовать возвращаемое значение этого метода для выделения буфера, предназначенного для хранения всех данных в этом потоке.

В вашем случае существует довольно простое решение. У вас уже есть InputStream. Не читайте его в массив байтов; удалить все виды использования xmlContent, bais и доступно(). Разберите исходный InputStream вместо:

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

Проблема решена. Вы были правы, проблема была связана с содержимым InputStream. Во втором случае IS анализируется через два вида парсеров, которые изменяют его содержимое (корневого узла там не было). –

Смежные вопросы