Я создал папку xml под res и поместил myxml.xml в папку xml. Рез /XML/myxml.xml
Я хочу прочитать описание в соответствии с номером id. Как я могу это достичь? Пожалуйста, помогите.
myxml.xml выглядит следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<Books>
<Number id ="1">
<Description>This is childrens book.
</Description>
</Number>
<Number id = "2">
<Description>This is about cooking.
</Description>
</Books>
Вот код, с которым я работаю (но, похоже, ничего не делает)
try{
XmlPullParser xpp = getResources().getXml(R.xml.myxml);
while(xpp.getEventType() != XmlPullParser.END_DOCUMENT){
if(xpp.getEventType() == XmlPullParser.START_TAG){
if(xpp.getName().equals("Description")){
show1.setText(" " + xpp.getAttributeValue(1));
}
}
xpp.next();
}
}
catch(Throwable t){
}
Как это будет работать, если в нем нет нулевого значения. u r doin null.getResources();
Для чего вы пытаетесь достичь здесь, я бы рекомендовал использовать javax.xml.xpath. Взятый из примера на этой странице, адаптированный к вашему XML файлу (XPath здесь получит описание Number с атрибутом id из 2):
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "//Number[@id='2']/Description";
try {
InputSource inputSource = new InputSource(activity.getResources().openRawResource(R.raw.myxml));
Node node = (Node) xpath.evaluate(expression, inputSource, XPathConstants.NODE);
String description = node.getTextContent();
} catch (Exception e) {
Log.d("ParseException", e.toString());
}
Я немного обновил этот пример, чтобы загрузить InputSource из потока ресурсов. Для этого вам кажется, что вам нужно поместить ваш xml файл в папку res/raw, а не res/xml (на основе этого ответа: проблема загрузки и анализа XML из ресурсов). Я также должен был сделать проект > чистым, чтобы заставить это работать.
Вероятно, вы также захотите обработать ошибку исключения разбора немного лучше!
Причина, по которой он не работает, заключается в том, что вы вызываете метод xrp.getName()
, когда текущий eventType
равен XmlPullParser.TEXT
.
В соответствии с документацией:
public abstract String getName()
События START_TAG или END_TAG... Если текущее событие не START_TAG, END_TAG или ENTITY_REF, null вернулся.
Я бы создал Stack<String>
для хранения имен элемента, в котором я сейчас. Когда я доберусь до начального тега, я бы нажал имя на верх, и когда я нахожусь в конце тега, я бы назвал это имя сверху. Таким образом, когда я в текстовом элементе, я бы знал весь xPath моего текущего местоположения.
вы можете использовать это, я уверен, что это поможет вам
XmlResourceParser pars = res.getXml(R.xml.myxml);
while (pars.getEventType() != XmlResourceParser.END_DOCUMENT) {
if (pars.getEventType() == XmlResourceParser.START_TAG) {
if(pars.getName().equals("Number")) {
int id = pars.getAttributeIntValue(null, "id", 0);
}
}
pars.next();
}
pars.close();
в вашем Xml вы забыли положить /
в свой тег Number
<Number id ="1" />
используйте эту ссылку, чтобы понять XmlResourceParser, она проста в использовании http://www.anddev.org/using_xmlresourceparser_to_parse_custom_compiled_xml-t9313.html
Я не думаю, что какое-либо из ваших условий "если" становится удовлетворительным. Верните строку, которая не пуста, и посмотрите, отображается ли она. Если да, то переосмыслите свою логику для метода getEventsFromAnXML.
Вероятно, у вас есть непредвиденная ситуация, и ваша программа выдает исключение и умирает.
Найдите трассировку печатного стека и добавьте ее в свой вопрос. Это, скорее всего, скажет вам, почему. Очень распространенная причина состоит в том, чтобы иметь неинициализированные переменные, которые затем пытаются вызвать метод при предоставлении исключения NullPointerException.
Проблема заключается в том, что вы не можете получить доступ к ресурсам APK, как они находятся на пути, потому что они скомпилированы в ваше приложение. Если вы хотите получить доступ к ресурсу напрямую, попробуйте следующее:
InputStream inputStream = context.getResources().openRawResource(R.xml.myxml);
InputSource inputSource = new InputSource(inputStream);
Вам может потребоваться переместить XML файл в папку res/raw/
и использовать R.raw.myxml
для доступа к нему.
this
должно работать нормально.
Я бы не использовал XPath
для этого, XMLResourceParser -класс должен был это сделать (учебник).
В вашем примере я заметил, что в XML отсутствует тег закрытия </Number>
, где атрибут id равен "2". Его возможная ошибка форматирования, такая как это может привести к вашей ошибке.