2012-09-21 3 views
0

일부 유니 코드 문자로 XML 출력을 가져 오려고했습니다. 태그 안의 완전한 문자열을 읽을 수는 없지만 단지 하나만 읽을 수있었습니다.Java/Android에서 XML의 유니 코드 문자 읽기

여기 내 XML 출력

<item> 
    <id>1</id>  
    <name>&#x0DBD;&#x0DDC;&#x0DBD;&#x0DCA;</name> 
    <cost>155</cost> 
    <description>&#x0DBD;&#x0DDC;</description> 
</item> 

이 내가 XML 문자열을 구문 분석하는 데 사용하는 내 자바 코드입니다.

public Document getDomElement(String xml) { 
Document doc = null; 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
try { 

    DocumentBuilder db = dbf.newDocumentBuilder(); 

    InputSource is = new InputSource(); 
    is.setEncoding("UTF-16"); 
    is.setCharacterStream(new StringReader(xml)); 
    doc = db.parse(is); 

} catch (ParserConfigurationException e) { 
    Log.e("Error: ", e.getMessage()); 
    return null; 
} catch (SAXException e) { 
    Log.e("Error: ", e.getMessage()); 
    return null; 
} catch (IOException e) { 
    Log.e("Error: ", e.getMessage()); 
    return null; 
} 
// return DOM 
return doc; 
} 

정상적인 영어 문자를 사용하면 완전한 문자열을 제공합니다. 유니 코드 명으로

+0

영어 이외의 문자를 구문 분석하려고하면 어떻게됩니까? 문자열이 올바르지 않습니까? 아니면 실패합니까? – helios

+0

실패하지 않습니다. 단지 첫 번째 문자 만 읽습니다. 이 예제에서는 & xdDBD 만 출력합니다. & # x0DDD; & # x0DDC; & # x0DBD; & # x0DCA; – Chrishan

+0

오, 오케이. 하지만 두 가지 :'valueOfTheContainedText.length()'는 1 또는 4를 반환하고, xml은 구문 분석 전에 출력한다면, 맞습니까? – helios

답변

0

이것은 내 문제를 해결하는 데 사용 된 코드입니다.

NodeList idlist = doc.getElementsByTagName(KEY_ID); 
    NodeList namelist = doc.getElementsByTagName(KEY_NAME); 
    NodeList costlist = doc.getElementsByTagName(KEY_COST); 
    NodeList desclist = doc.getElementsByTagName(KEY_DESC); 
    for (int i=0; i<idlist.getLength(); i++) 
    { 
     Item item = new Item(); 
     item.setCost(costlist.item(i).getTextContent()); 
     item.setDescription(desclist.item(i).getTextContent()); 
     item.setName(namelist.item(i).getTextContent()); 
     itemarray.add(item); 

    } 
0
  • 일반적으로 UTF-8을 의미하지만 당신은 사용하는 UTF-16, bad

  • XML은 그래서 당신이 그것을

  • 를 오버라이드 (override) 할 필요가 없습니다 그 header에 자신의 인코딩을 정의하다
+1

나는 그것에 대해 생각하고 있었지만, 사실 그는 메모리에있는 String으로부터 읽으려고하고있다. 그래서 실제로 InputSource에 대한 char 인코딩을 설정하는 것은 아무런 효과가 없다. 그리고 메모리 문자열의 xml은 이미 디코딩되었으므로 인코딩 헤더가 없습니다. – helios

1

코드를 사용해 본 결과 아무런 문제가 없습니다. 비영어권 문자가있는 노드를 평가할 경우 문자가 존재하며 올바른 문자 수를가집니다. 사용 된 글꼴에 글리프가 없기 때문에 인쇄 할 수 없습니다. 그러나 value.codePointAt(i)은 올바른 코드 포인트를 반환합니다.

NodeList list = doc.getDocumentElement().getChildNodes(); 
    for (int i=0; i<list.getLength(); i++) 
    { 
     String value = list.item(i).getTextContent(); 
     for (int j=0; j<value.length(); j++) 
      System.out.print(" " + value.codePointAt(j)); 
     System.out.println(); 
    } 

출력 :하여 코드 포인트의 진수 표현에 대응

49 
3517 3548 3517 3530 
49 53 53 
3517 3548 

.

xml 문자열을 직접 작성했습니다. 이미 기억에 남았습니까?

+1

나에게 많은 도움이됩니다. 하지만이 방법을 사용하면 노드별로 노드를 읽을 수 없습니다. 나는 여기에 나의 코드를 넣을 것이다. 고마워. – Chrishan