Java new InputSource не генерирует поток символов

#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 в комментариях к моему первоначальному вопросу), что, к сожалению, все еще не устраняет проблему — теперь я отредактировал свой исходный вопрос, чтобы показать исправленный код.