私は Android 1.5 のアプリケーションに取り組んでいます。現在、XML ファイルを解析する必要があります。Android は API レベル 3 で XPath をネイティブにサポートしていないため、dom4j および jaxen ライブラリを使用してファイルを読み取ることにしました。
私は単純な XML ファイル (test1.xml) を持っています:
<?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 ファイルを読み取り、「/tests/test」ノードを見つけて、その属性を列挙します。このコードを「デスクトップ」Java アプリケーションの一部として実行すると (私は Java 用語に詳しくありません)、期待どおりに表示されます (Fedora Linux での OpenJDK 1.8.3):
SEVERE: ATTR: name=main name
残念ながら、Android 1.5 (emulator ofc) では、まったく同じコードが表示されます。
E/AutoTesterMain( 823): ATTR: base_lang=main name
ご覧のとおり、属性の値は問題ありませんが、名前に問題があります。なぜこの場所に他の DOM 要素 (「/tests/resources」) の属性名が表示されるのか、まったくわかりません。私のファイルを正しく解析していないようなので、おそらく何か間違った設定をしています...
もちろん、どちらのバージョンも dom4j および jaxen ライブラリでまったく同じ .jar を使用するため、おそらくこれで問題ありません。
この問題は、誤った属性のリストだけでなく、より多くの影響を及ぼします。また、XPath を使用して属性を適切に読み取ることもできません。「/tests/test/@name」を選択すると何も返されませんが、「/tests/test/@base_lang」を選択すると「メイン名」文字列が返されます。これは明らかに、上記の属性のリストと同じエラーが原因です。
誰もこれに遭遇しましたか?どうすれば修正できますか?
残念ながら、ネイティブ XPath サポートを備えた新しい Android に移行することは、私にとって選択肢ではありません。
私はウェブとここで何かを見つけようとしていましたが、運がありませんでした.