7

我创建了一个 Java 应用程序,它打开一个看起来像这样的 xml 文件:

<AnimalTree>
  <animal>
    <mammal>canine</mammal>
    <color>blue</color>
  </animal>
  <!-- ... -->
</AnimalTree>

我可以使用以下方法打开它:

File fXmlFile = getResources.getXml("res/xml/data.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList animalNodes = doc.getElementsByTagName("animal");

然后我可以简单地创建一个节点,将对象推入 ListArray,然后在循环遍历 ListArray 时对对象执行我想要的操作。

for (int temp = 0; temp < animalNodes.getLength(); temp++) {
Node nNode = animalNodes.item(temp);     
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
question thisAnimal = new animal();
thisAnimal.mammal = getTagValue("mammal",eElement);
// ...

干净利落!现在,在 Android 中我不能简单地读取文件“ res/xml/data.xml”,因为“ File();”需要一个String不是integer(id)。这就是我迷路的地方。有什么方法可以让“ File();”打开文件,还是不使用SAXparseror就不可能XPP?(无论我多么努力,我都真的无法理解。)
如果我被迫使用这些方法,有人可以向我展示一些类似于我的示例的简单代码吗?

4

3 回答 3

9

如果它在资源树中,它将获得分配给它的 ID,因此您可以使用 openRawResource 函数打开一个流:

InputStream is = context.getResources().openRawResource(R.xml.data);

至于在 Android 中使用 XML,ibm.com 上的这个链接非常详尽。

Listing 9. DOM-based implementation of feed parser那个链接。

一旦你有了输入流(上图),你就可以将它传递给 DocumentBuilder 的一个实例:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document dom = builder.parse(this.getInputStream());
Element root = dom.getDocumentElement();
NodeList items = root.getElementsByTagName("TheTagYouWant");

请记住,我没有亲自这样做过——我假设 IBM 提供的代码有效。

于 2010-12-01T21:34:36.230 回答
2

我尝试了使用 openRawResource 的方法并得到了 SAXParseException。因此,相反,我使用 getXml 来获取 XmlPullParser。然后我使用 next() 逐步完成解析事件。实际文件是 res/xml/dinosaurs.xml。

XmlResourceParser parser = context.getResources().getXml(R.xml.dinosaurs);
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
    switch (eventType) {
        case XmlPullParser.START_DOCUMENT :
            Log.v(log_tag, "Start document");
            break;
        case XmlPullParser.START_TAG :
            Log.v(log_tag, "Start tag " + parser.getName() );
            break;
        case XmlPullParser.END_TAG :
            Log.v(log_tag, "End tag " + parser.getName() );
            break;
        case XmlPullParser.TEXT :
            Log.v(log_tag, "Text " + parser.getText() );
            break;
        default :
            Log.e(log_tag, "Unexpected eventType = " + eventType );
    }
    eventType = parser.next();
}
于 2017-03-03T16:50:10.083 回答
-1

尝试这个,

this.getResources().getString(R.xml.test); // returns you the path , in string,invoked on activity object
于 2014-02-27T13:56:25.070 回答