2011-02-07 8 views
1

私はAndroid 1.5用のアプリケーションを開発中です。現在、私はXMLファイルを解析する必要があります。 AndroidはAPIレベル3でネイティブにXPathをサポートしていないため、dom4jライブラリとjaxenライブラリを使用してファイルを読み込むことにしました。Android 1.5とdom4j - 属性名が正しく解析されない

私は、単純なXMLファイル(test1.xml)があります、それはtest1.xmlファイルを読み込み

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

"/テスト/テスト" ノードとを列挙を見つける:

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

、簡単なコードをそれは属性です。私は(私はJavaの用語では深くはないよ)「デスクトップ」のJavaアプリケーションの一部として、このコードを実行すると、それは私が(のFedora LinuxでのOpenJDK 1.8.3)を期待するものが表示さ:

SEVERE: ATTR: name=main name 

を残念ながら、中1.5(エミュレータOFC)のAndroid、まったく同じコードを示しています

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

あなたが見ることができるように、属性の値はOKですが、名前の問題があります。私は完全に他のDOM要素( "/ tests/resources")からの属性の名前がなぜこの場所に現れているのか全く分かりません。両方のバージョンは、のdom4jとにJaxenライブラリとまったく同じ.jarsを使用していますので、これはおそらく大丈夫です。もちろん、

...間違って私のファイルを解析すると思われるので、私はおそらく何かを間違って設定します。

この問題は、リストだけ間違った属性よりも効果があります。また、 "/ tests/test/@ base_lang"は "main name"という文字列を返しますが、 "/ tests/test/@ name"を選択すると何も表示されません。これは明らかに、上のリストの属性と同じエラーが原因です。

は、誰もがこれに遭遇していますか?どうすれば修正できますか?ネイティブのXPathをサポートした新しいアンドロイドへの移行

は、残念ながら私のためのオプションではありません。

私はここでウェブとの何かを見つけようとしますが、運を持っていませんでした。

答えて

1

エミュレータのAndroid 2.1に私のアプリを実行しているとき、私は同じ問題を持っています。 2.2では完全に動作しますが。私が使用しているdom4jのlibのバージョンは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(); 

この問題の解決策が見つかったら教えてください。

EDIT:は最終的に私は解決策を見つけた:EDIT2 dom4jの2.0アルファ2 ため同じ問題。本当にdom4jソースコードの問題。ここには約2年前に記録された問題のlinkがあります。 は、あなたがのsrc \のJava \ \ dom4jの-1.6.1で正しい以下の方法を必要とする、それを修正するには、\ orgの\ 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; 
     } 
関連する問題