#java #xpath #xml-parsing #bytearrayinputstream
#java #xpath #синтаксический анализ xml #bytearrayinputstream
Вопрос:
В Java, когда я пытаюсь создать новый InputSource
и передать его ByteArrayInputStream
, он не создает поток символов и не устанавливает кодировку.
XPathExpression compilablePath = xpath.compile("/OutputRoot/Output/AuthPlus/DataMatches/NoAgePri");
String result = compilablePath.evaluate(
new InputSource(new StringReader(xml))
);
if (!"".equals(result)) {
this.noAgePri = Integer.parseInt(result);
}
Я делаю выше, где xml
действительный XML хранится в виде строки. Сам XML выглядит так, как показано ниже.
<?xml version="1.0" encoding="utf-16"?>
<OutputRoot>
<Output>
<Control>
<Reference>ZX1J49CKQ4</Reference>
</Control>
<AuthPlus>
<ApplicantIdentifier>1</ApplicantIdentifier>
<AuthPlusRef />
<IACA>
<NoPriItem>12</NoPriItem>
<StrtOldPri>199402</StrtOldPri>
<NoSecItem>4</NoSecItem>
<NoSecSrc>1</NoSecSrc>
<StrtOldSec>201608</StrtOldSec>
</IACA>
<AOCA>
<NoPriItem>1</NoPriItem>
<StrtOldPri>200910</StrtOldPri>
<NoSecItem>1</NoSecItem>
<NoSecSrc>1</NoSecSrc>
</AOCA>
<IAPA>
<NoPriItem>0</NoPriItem>
<NoSecItem>0</NoSecItem>
<NoSecSrc>0</NoSecSrc>
</IAPA>
<AOPA>
<NoPriItem>0</NoPriItem>
<NoSecItem>0</NoSecItem>
<NoSecSrc>0</NoSecSrc>
</AOPA>
<DataMatches>
<NoAgePri>10</NoAgePri>
</DataMatches>
<Decision>
<DecCode>AU01</DecCode>
<DecText>The Applicant has been Authenticated to your required 'Level 1'</DecText>
<AuthIndex>80</AuthIndex>
<AuthText>A high level of Authentication has been found for the identity supplied</AuthText>
<IDConfLvl>1</IDConfLvl>
<IDConfText>The identity supplied has been confirmed at the required 'Level 1'</IDConfText>
<HighRiskCount>0</HighRiskCount>
</Decision>
</AuthPlus>
</Output>
</OutputRoot>
В результате получается result
пустая строка и, следовательно noAgePir
, она не задана.
Заранее спасибо за любую помощь.
Исправлено.
Спасибо за всю помощь — основная проблема была с XPath, который я использовал. По какой-то причине XML-файл не рассматривал Output
допустимый тег — только когда я это /OutputRoot/child::node()[2]/AuthPlus/DataMatches/NoAgePri
сделал, это сработало.
Все еще не уверен, почему, но, по крайней мере, это работает.
Комментарии:
1. Пожалуйста, укажите значение
xml
в вашем вопросе. Обратите внимание, что здесь вам вообще не нужно использовать кодировку; вы можете просто написатьnew InputSource(new StringReader(xml))
.2. Отредактировал мой вопрос, чтобы включить XML. Когда я пробую new
StringReader(xml)
, как вы предлагаете, XPath по-прежнему возвращает только пустые строки.3. Ваше выражение XPath содержит
Output/DataMatches
, но DataMatches не является дочерним элементом вывода.4. Спасибо, что указали на это @VGR к сожалению, он по-прежнему не определяет фактическое значение в XML — продолжает возвращать пустую строку
Ответ №1:
Результат вашего выражения XPath пуст, потому что ваш путь неверен: вы пропустили шаг AuthPlus
.
Вам необходимо применить подход «разделяй и властвуй» для решения подобных проблем. Вы можете проверить правильность вашего вызова API, попробовав его с помощью тривиального выражения XPath, и вы можете проверить правильность вашего XPath, попробовав его в инструменте тестирования XPath (например, oXygen). Похоже, вы поспешили с выводами о причине ошибки, не рассмотрев сначала простейшую возможность.
(И, сказав это, если xml
это строка, тогда вы должны использовать StringReader, а не преобразовывать его в байты, чтобы анализатор XML мог преобразовать его обратно в строку.)
Комментарии:
1. Привет, спасибо за помощь — исправления, на которые вы указали, я применил (как также было предложено VGR в комментариях к моему первоначальному вопросу), что, к сожалению, все еще не устраняет проблему — теперь я отредактировал свой исходный вопрос, чтобы показать исправленный код.