2016-10-18 1 views
0

En Java, lorsque j'essaie de créer un nouveau InputSource et de lui attribuer un ByteArrayInputStream, il ne crée pas de jeu CharacterStream ni d'encodage.Java new InputSource ne générant pas de flux de caractères

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); 
} 

que je fais ce qui précède, où xml est un XML valide stocké sous forme de chaîne. Le XML lui-même est comme ci-dessous.

<?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> 

Le résultat est que result est une chaîne vide et donc noAgePir n'est pas réglé.

Merci à l'avance pour toute aide.

Fixé.

Merci pour toute l'aide - le problème principal était avec le XPath que j'utilisais. Pour une raison quelconque, le fichier XML ne considérait pas Output comme une balise valide - seulement lorsque je l'ai fait /OutputRoot/child::node()[2]/AuthPlus/DataMatches/NoAgePri a-t-il fonctionné.

Je ne sais toujours pas pourquoi mais cela fonctionne au moins.

+1

S'il vous plaît inclure la valeur de 'xml' dans votre question. Notez que vous n'avez pas besoin d'utiliser un jeu de caractères ici; vous pouvez simplement écrire 'new InputSource (new StringReader (xml))'. – VGR

+0

Édité ma question pour inclure le XML. Quand j'essaie de nouveau 'StringReader (xml)' comme vous le suggérez, le XPath ne renvoie que des chaînes vides. – MPhil123

+0

Votre expression XPath contient 'Output/DataMatches' mais DataMatches n'est pas un enfant de Output. – VGR

Répondre

0

Le résultat de votre expression XPath est vide car votre chemin est erroné: vous avez omis l'étape AuthPlus.

Vous devez appliquer une approche «diviser pour régner» pour résoudre les problèmes de ce type. Vous pouvez vérifier que votre invocation d'API est correcte en l'essayant avec une expression XPath triviale, et vous pouvez vérifier que votre XPath est correct en l'essayant dans un outil de test XPath (par exemple oXygen). Vous semblez avoir tiré des conclusions hâtives sur la cause de l'erreur sans considérer d'abord la possibilité la plus simple.

(Et après avoir dit que, si xml est une chaîne, vous devez utiliser un StringReader, plutôt que de le convertir en octets juste pour que l'analyseur XML peut le convertir en une chaîne.)

+0

Salut, merci pour l'aide - les corrections que vous avez indiqué que j'ai appliqué (comme cela a également été suggéré par VGR dans les commentaires de ma question initiale) qui, malheureusement, ne résout toujours pas le problème - j'ai maintenant édité ma question originale pour montrer le code corrigé. – MPhil123