2017-08-11 10 views
3

AndroidスタジオでドキュメントビルダとNodeListを使用してXMLドキュメントを解析しています。私は以前、xmlが間違っていて、アンパサンドがエスケープされていないことが判明しました。 W3 XMLバリデータでこれものの、ダブルチェックの世話をした後、私はまだ予期しないトークンエラーが表示されます。Androidスタジオでドキュメントビルダーを使用すると予期しないトークン(<)が発生する

e: "org.xml.sax.SAXParseException: Unexpected token (position:TEXT \n \n 601\n [email protected]:1 in [email protected])"

しかし、私は、XMLを開き、ラインを見たとき、私は何も表示されないために言及厄介であると考えられます:

... ... 
5257 <WebSvcLocation> 
5258 <Id>1521981</Id> 
5259 <Name>Warehouse: Row 3</Name> 
5260 <SiteName>Warehouse</SiteName> 
5261 </WebSvcLocation> 
5262 </ArrayOfWebSvcLocation> 

xmlも非印刷文字でチェックしていますが、何も見つかりませんでした。私は読んしようとしているXMLがhereをホストされている

public List<Location> SpinnerXML(String xml){ 
    List<Location> list = new ArrayList<Location>(); 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder; 
    InputSource is; 
    String s = xml.replaceAll("[&]"," and "); 

    try { 
     builder = factory.newDocumentBuilder(); 
     is = new InputSource(new StringReader(s)); 
     Document doc = builder.parse(is); 
     NodeList lt = doc.getElementsByTagName("WebSvcLocation"); 
     int id; 
     String name,siteName; 

     for (int i = 0; i < lt.getLength(); i++) { 
      Element el = (Element) lt.item(i); 
      id = Integer.parseInt(getValue(el, "Id")); 
      name = getValue(el, "Name"); 
      siteName = getValue(el, "SiteName"); 

      list.add(new Location(id, name, siteName)); 
     } 

    } catch (ParserConfigurationException e){ 
    } catch (SAXException e){ 
     e.printStackTrace(); 
    } catch (IOException e){ 
    } 

    return list; 
} 

:以下は、私が使用しているコードです。

ありがとうございました!

+1

このWebSvcLocation要素全体のデータを共有できますか? (おそらく開始タグも存在する)。また、5262後の行は何ですか? – khriskooper

+0

5262の後にはオープンラインのみが存在し、それ以外の場合はドキュメントの最後です。 WebSvcLocation要素全体を含めるように質問を編集します。 – charwayne

+1

ええと、XMLファイルがすべて良かったかどうかを再確認します。正しいエンコード/行末/文字セットなどを使用していますか? XMLファイルをどこかにホストすることができるので、それを確認できますか? – khriskooper

答えて

1

InputSourceは、いくつかのがエンコーディングにとしてを推測するので、ここでしようとするいくつかのものだかのようです。

hereから、それは言う:

Android note: The Android platform default (encoding) is always UTF-8.

hereから参照

Java stores strings as UTF-16 internally.

"Java stores strings as UTF-16 internally, but the encoding used externally, the "system default encoding", varies.

(1)私が最初にお勧めしないだろう:

is.setEncoding("UTF-8"); 

(2)しかし、それが何をすべき害をこれを置き換える:

Document doc = builder.parse(new ByteArrayInputStream(s.getBytes())); 

(3)ORはこれを試してください:

String s1 = URLDecoder.decode(s, "UTF-8"); 
Document doc = builder.parse(new ByteArrayInputStream(s1.getBytes())); 

を: をあなたがしようとした場合(2)または(3)OUTコメント:これにより

Document doc = builder.parse(is); 

is = new InputSource(new StringReader(s)); 

String sが壊れている可能性があります。

+1

あなたの提案を適用しようとしましたが、まったく同じエラーが表示されます。私の推測では、InputSourceはエンコーディングを知っており、問題は実際にはもっと深いものです。あなたの提案をありがとう! – charwayne

+1

私が読んだところでは、生の入力ストリーム(より粗い方が良い)をInputSourceを使用しないで、Stringを使用しないようにしてください。データが少ないほど操作性は良くなります。これはいくつかの人々のためにそれを解決しました。しかし、データが破損している場合は、BADデータファイルの例やSpinnerXMLメソッドへの関数パスを指定しない限り、私が何をするのか分かりません。それがなければバグを再現することはできません。あなたはテストして、xml.replaceAll( "[&]"、 "and"); ?もう一つの可能​​性。それがあまりにも大きければ、logcatにダンプするのが最善で、そうでなければファイルです。ああ、あなたはそれを共有して、クール。 –

+1

私はあなたのデータを見て、あなたの変更されたデータのダンプが便利かもしれないことを忘れないでください。 SAXParserに問題があるのはあなただけではありません。データを入手しました。 –

関連する問題