Android - анализ XML - работает на эмуляторе, но не на устройстве - PullRequest
0 голосов
/ 05 мая 2011

В моем приложении я анализирую xml, фрагмент структуры, создающий проблемы:

<answers>
    <answer value="A">A</answer>
    <answer value="B">B</answer>
    <answer value="C">C</answer>
</answers>

Я анализирую его с XML DOM:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new InputSource(url.openStream()));
doc.getDocumentElement().normalize();

, который прекрасно работает, и в зависимости от пунктов ответа я создаю RadioButtons следующим образом:

NodeList answers = doc.getElementsByTagName("answers").item(0).getChildNodes();

int j = 0;
RadioGroup group = new RadioGroup(this);
RadioButton button1 = new RadioButton(this);
button1.setId((i+1)*100+(j++));
button1.setText(answers.item(1).getChildNodes().item(0).getNodeValue());
button1.setTextColor(Color.BLACK);

RadioButton button2 = new RadioButton(this);
button2.setId((i+1)*100+(j++));
button2.setText(answers.item(2).getChildNodes().item(0).getNodeValue());
button2.setTextColor(Color.BLACK);

RadioButton button3 = new RadioButton(this);
button3.setId((i+1)*100+(j));
button3.setText(answers.item(3).getChildNodes().item(0).getNodeValue());
button3.setTextColor(Color.BLACK);

Этот фрагмент кода отлично работает в эмуляторе SDK v.7 (Android 2.0), в то время как мой HTC Desire работает на Android 2.1u1 (так SDK v.8)

Но в устройстве я получаю сообщение об ошибке в этой строке button2.setText(answers.item(2).getChildNodes().item(0).getNodeValue());, предполагая, что в ответах нет .item(2), но это должно быть ... Я отлаживал этот код в эмуляторе и обнаружил, что answers.item(0) TextNode, содержащий имя узла XML «ответы» ...

Но это правда, я немного запутался, и все разбирается при синтаксическом анализе этого XML, так как мне все еще приходится подсчитывать, насколько я глубоко и когда вызывать какой индекс по какому элементу (узлу) ... Но все же я обнаружил, что эта реализация намного проще, чем использование SAX ...

Есть ли что-то похожее на SimpleXml из PHP в Java ???

В любом случае, моя главная проблема: как получается, что приложение отлично работает в эмуляторе, в то время как на устройстве оно выдает NullPointerException в строке, где я пытаюсь установить текст для button2 ???

Большое спасибо за помощь !!!

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

getChildNodes () возвращает все Node с ответов, а не только все Element с.Вы, вероятно, хотите перебрать все дочерние элементы и проверить, является ли каждый из них Element с именем тега "answer"

Как насчет чего-то вроде этого:не зависит от определенного числа дочерних элементов ответов, и вы гарантируете, что не будете пытаться получить доступ к несуществующему элементу.

Если вы действительно хотите сделать это на основе дочерних элементов ответовузел,

Node answersNode = // get the node
NodeList childNodes = answersNode.getChildNodes();
for (int x = 0; x < childNodes.getLength(); x++) {
  Node node = childNodes.get(0);
  if (node instanceof Element && node.getNodeName().equals("answer")) {
    // do the same as above to create a radio button.
  }
}
0 голосов
/ 31 августа 2011

Использование (Простой XML) [http://simple.sourceforge.net/]

@Root
public class Answers {

   @ElementMap(entry="answer", key="value" attribute="true" inline=true)
   public Map<String, String> map;
}

Или если у вас есть только три записи, которые вы можете сделать.

@Root
public class Answers {

   @Path("answer[1]")
   @Text
   private answerValue1;

   @Path("answer[2]")
   @Text
   private answerValue2;

   @Path("answer[3]")
   @Text
   private answerValue3;

   @Path("answer[1]")
   @Attribute(name="value")
   private answerAttribute1;

   @Path("answer[2]")
   @Attribute(name="value")
   private answerAttribute2;

   @Path("answer[3]")
   @Attribute(name="value")
   private answerAttribute3;
}

Тогда читайте вот так.

Persister persister = new Persister();
Answers answers = persister.read(Answers.class, xml);

Все просто!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...