2011-02-07 2 views
1

Android 1.5 용 응용 프로그램에서 작업 중입니다. 현재 XML 파일을 구문 분석해야합니다. 안드로이드는 API 레벨 3에서 기본적으로 XPath를 지원하지 않기 때문에 dom4j 및 jaxen 라이브러리를 사용하여 파일을 읽기로 결정했습니다.Android 1.5 및 dom4j - 특성 이름의 구문이 잘못 분석되었습니다.

<?xml version="1.0" encoding="utf-8" ?> 
<tests> 
    <resources base_lang="en"> 
      <string base="example"> 
        <localization lang="pl">Przykład</localization> 
      </string> 
    </resources> 
    <test name="main name"> 
      <title>Main Title</title> 
      <description>Long description</description> 
    </test> 
</tests> 

그리고 간단한 코드 :

SAXReader reader = new SAXReader(); 
Document doc = reader.read("file:///sdcard/tests/test1.xml"); 
Node node = doc.selectSingleNode("/tests/test"); 
Element elem = (Element)node; 
for(int j=0;j<elem.attributeCount();++j) { 
    Attribute attr = elem.attribute(j); 
    Logger.getLogger(AutoTesterMain.class.getName()).log(Level.SEVERE, "ATTR: "+attr.getName()+"="+attr.getValue()); 
} 

그것은, test1.xml 파일을 읽고 "/ 테스트/테스트"노드를 열거를 발견

나는 간단한 XML 파일 (test1.xml)가 그것은 속성입니다. 나는 (나는 자바 용어에 깊은 아니에요) "바탕 화면"자바 응용 프로그램의 일환으로이 코드를 실행하면, 내가 (페도라 리눅스에서 오픈 JDK 1.8.3)을 기대하는 표시

SEVERE: ATTR: name=main name 

을 불행하게도,에 당신이 볼 수 있듯이 속성의 값이 OK입니다,

E/AutoTesterMain( 823): ATTR: base_lang=main name 

하지만, 문제는 이름이있다 : 1.5 (에뮬레이터 년 OFC) 안드로이드, 동일한 코드를 보여줍니다. 나는이 장소에서 왜 완전히 다른 DOM 요소 ("/ tests/resources")의 속성 이름이 나타나는 지 전혀 모릅니다. 내 파일을 잘못 파싱 한 것 같습니다. 그래서 아마도 뭔가 잘못 설정 한 것 같습니다 ...

물론 두 버전 모두 dom4j 및 jaxen 라이브러리와 완전히 똑같은 .jars를 사용하므로 아마 괜찮을 것입니다.

이 문제는 잘못된 속성 목록보다 많은 영향을 미칩니다. 또한 "/ tests/test/@ base_lang"은 "main name"문자열을 제공하지만 "/ tests/test/@ name"을 선택하면 아무것도 표시되지 않는 XPath를 사용하여 특성을 올바르게 읽을 수 없습니다. 이는 분명 위의 목록 속성과 동일한 오류로 인해 발생합니다.

누구에게이 문제가 발생 했습니까? 내가 어떻게 고칠 수 있니?

네이티브 XPath 지원으로 최신 Android로 이동하는 것은 불행히도 나를위한 옵션이 아닙니다.

나는 웹과 여기에서 아무 것도 찾으려고했지만 운이 없었습니다.

답변

1

에뮬레이터 Android 2.1에서 내 앱을 실행할 때 동일한 문제가 있습니다. 2.2에서는 완벽하게 작동합니다. 내가 사용하고있는 dom4j 라이브러리의 버전은 v1.6입니다.

모든 속성 이름이 내 xml 파일의 첫 번째 속성의 이름으로 대체되는 다음 추출물에서 볼 수 있듯이 : 실제 XML 인 경우

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd"><ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1"> 
    <head> 
     <meta version="dtb:uid" version="6efac3c8-0d51-46bd-b125-58dae01bf92e"/> 
     <meta version="dtb:depth" version="4"/> 
     <meta version="dtb:totalPageCount" version="0"/> 
     <meta version="dtb:maxPageNumber" version="0"/> 
    </head> 
    <docTitle> 
     <text>Book</text> 
    </docTitle> 
    <navMap> 
     <navPoint version="navPoint-1" version="1"> 
      <navLabel> 
       <text>Header1</text> 
      </navLabel> 
      <content version="Text/Section0001.xhtml"/> 
      <navPoint version="navPoint-2" version="2"> 

을 :

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" 
    "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd"> 

<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1"> 
    <head> 
     <meta name="dtb:uid" content="6efac3c8-0d51-46bd-b125-58dae01bf92e"/> 
     <meta name="dtb:depth" content="4"/> 
     <meta name="dtb:totalPageCount" content="0"/> 
     <meta name="dtb:maxPageNumber" content="0"/> 
    </head> 
    <docTitle> 
     <text>Book</text> 
    </docTitle> 
    <navMap> 
     <navPoint id="navPoint-1" playOrder="1"> 
      <navLabel> 
       <text>Header1</text> 
      </navLabel> 
      <content src="Text/Section0001.xhtml"/> 
      <navPoint id="navPoint-2" playOrder="2"> 

이 XML 문서가 잘못 파싱 된 것 같습니다. 내 소스 코드는 다음과 같습니다.

inputStream = new FileInputStream(ncfPath); 
SAXReader reader = new SAXReader(); // dom4j SAXReader 
Document document = reader.read(inputStream); 
String xml = document.asXML(); 

이 문제에 대한 해결책을 찾았 으면 알려주세요.

편집 : DOM4J 2 EDIT2 2.0 알파에 대한 같은 문제는 : 마침내 나는 해결책을 발견했습니다. dom4j 소스 코드에 실제로 문제가 있습니다. 거의 2 년 전에이 문제에 대한 link이 있습니다 (!). 당신의 src \ 자바 \ \ DOM4J-1.6.1에서 올바른 다음과 같은 방법이 필요를 해결하려면 \ 조직 \ DOM4J 트리 \의 NamespaceStack.java \

public QName getAttributeQName(String namespaceURI, String localName, String qualifiedName) { 
    // Fix: qualifiedName is empty on Android 2.1 
    // refer to https://sourceforge.net/tracker/index.php?func=detail&aid=2789052&group_id=16035&atid=116035# 
     if (qualifiedName == null || qualifiedName.length() == 0) { 
      qualifiedName = localName; 
     }