2011-05-21 82 views
1

我在res下创建了一个xml文件夹,并将myxml.xml放置在xml文件夹中。 res/xml/myxml.xml在阅读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){ 

     } 
+3

请**,不要**继续发布重复的问题。我已将它们合并到您的原件中,您可以自由编辑以提供更多信息。 – 2011-06-01 23:28:17

回答

0

我在你的榜样注意到XML似乎缺少收盘</Number>标签其中ID属性等于“2”。它可能会出现格式错误,例如这可能会导致您的错误。

+0

该错误不在代码中。 xmlPullParser是读取xml文档的正确方法(新的android)。谢谢 – artist 2011-05-21 04:54:35

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

+0

谢谢乔治。我尝试了上面的代码,它插入“2”,因为它是xml文件中的最后一项。如何在editText中使用相应的ID显示说明。 – artist 2011-05-22 04:55:46

2

对于你想要在这里实现的,我建议使用javax.xml.xpath。从示例获取的该网页上,适应您的XML文件(这里的XPath将获得数的描述与2 id属性):

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)。我还必须做项目>清理,以使其发挥作用。

您可能还想要以更好的方式处理分析异常错误!

+0

我在上面的代码中添加了textview.setText(“”+ description),但它不显示xml文件中的任何内容。有任何想法吗?我感谢你的帮助。 – artist 2011-05-23 04:39:11

+0

嘿,我已经稍微更新了这个例子 - 希望它现在能正常工作。让我知道你是否还有其他问题。 – actionshrimp 2011-05-23 22:58:51

0

问题是,您无法像访问路径一样访问APK资源,因为它们已编译到您的应用程序中。如果您想直接访问资源,试试这个:

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

您可能需要使用XML文件移动到res/raw/文件夹并使用R.raw.myxml,而不是访问它。

+0

它说“上下文”无法解决。我可以使用“this”而不是上下文吗?谢谢 – artist 2011-05-23 21:39:15

+0

@artist如果你在一个活动中,那么是的,这个''应该可以正常工作。 – Jess 2011-05-24 13:29:12

2

如果活动在其中有null,它将如何工作。

+0

..这很容易;)好抓! – 2011-05-24 05:56:14

0

你很可能有一个意想不到的情况,你的程序抛出异常并死亡。

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

1

它不工作的原因是因为当您目前的eventTypeXmlPullParser.TEXT时,您正在调用xrp.getName()方法。

按照documentation

公共抽象字符串的getName()

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

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

0

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