2011-05-21 41 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方法的邏輯。