在阅读xml文件时需要帮助

时间:2011-05-21 04:20:01

标签: android

我在res下创建了一个xml文件夹,并将myxml.xml放在xml文件夹中。 RES / XML / myxml.xml

我想根据身份证号码阅读说明。我怎样才能做到这一点? 请帮忙。

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){

        }

9 个答案:

答案 0 :(得分:2)

对于您在此处尝试实现的目标,我建议您使用javax.xml.xpath。取自该页面上的示例,适用于您的XML文件(这里的XPath将获取ID属性为2的Number的描述):

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中(基于此答案:problem loading and parsing xml from resources)。我还必须做项目&gt;干净,让这个工作。

您可能还希望以更好的方式处理解析异常错误!

答案 1 :(得分:2)

当活动在其中为null时,它甚至会如何工作.. u doin null.getResources();

答案 2 :(得分:1)

你可以使用这个,我相信这有助于你

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 id ="1" />

使用此链接了解XmlResourceParser,它易于使用 http://www.anddev.org/using_xmlresourceparser_to_parse_custom_compiled_xml-t9313.html

答案 3 :(得分:1)

它无效的原因是因为当前xrp.getName()eventType时您正在调用XmlPullParser.TEXT方法。

根据documentation

  

public abstract String getName()

     

对于START_TAG或END_TAG事件......如果   当前事件不是START_TAG,   END_TAG或ENTITY_REF,null为   返回。

我会创建一个Stack<String>来保存我当前所在元素的名称。当我到达开始标记时,我会将名称推到顶部,当我点击结束标记时,我会将名称从顶部弹出。这样,当我在文本元素中时,我会知道当前位置的整个xPath。

答案 4 :(得分:0)

我注意到在您的示例中,XML似乎缺少关闭</Number>标记,其中id属性等于“2”。可能出现格式错误,例如这可能导致您的错误。

答案 5 :(得分:0)

我不会使用XPathXMLResourceParser - 类就是为了做到这一点(tutorial)。

答案 6 :(得分:0)

问题在于您无法访问路径上的APK资源,因为它们已编译到您的应用程序中。如果要直接访问资源,请尝试以下操作:

InputStream inputStream = context.getResources().openRawResource(R.xml.myxml);
InputSource inputSource = new InputSource(inputStream);

您可能需要使用将XML文件移到res/raw/文件夹中,然后使用R.raw.myxml来访问它。

答案 7 :(得分:0)

您很可能遇到意外情况,并且您的程序会抛出异常而死亡。

找到打印的堆栈跟踪并将其添加到您的问题中。这很可能会告诉你原因。一个非常常见的原因是有未初始化的变量,然后你尝试在给出NullPointerException时调用一个方法。

答案 8 :(得分:0)

我不认为你的“if”条件是否满足。返回一个非空的字符串,看看是否显示。如果是,请重新查看getEventsFromAnXML方法的逻辑。