2

首先,感谢所有将花一点时间在这个问题上的人。

其次,对不起我的英语(不是我的第一语言!:D)。

好吧,这是我的问题。

我正在学习 Android,我正在制作一个使用 XML 文件来存储一些信息的应用程序。我创建文件没有问题,但尝试使用 XPath 读取 de XML 标记(DOM、XMLPullParser 等只会给我带来问题)我至少能够读取第一个。

让我们看看代码。

这是应用程序生成的 XML 文件:

<dispositivo>
    <id>111</id>
    <nombre>Name</nombre>
    <intervalo>300</intervalo>
</dispositivo>

这是读取 XML 文件的函数:

private void leerXML() {
    try {
        XPathFactory  factory=XPathFactory.newInstance();
        XPath xPath=factory.newXPath();

        // Introducimos XML en memoria
        File xmlDocument = new File("/data/data/com.example.gps/files/devloc_cfg.xml");
        InputSource inputSource = new InputSource(new FileInputStream(xmlDocument));

        // Definimos expresiones para encontrar valor.
        XPathExpression  tag_id = xPath.compile("/dispositivo/id");
        String valor_id = tag_id.evaluate(inputSource);

        id=valor_id;

        XPathExpression  tag_nombre = xPath.compile("/dispositivo/nombre");
        String valor_nombre = tag_nombre.evaluate(inputSource);

        nombre=valor_nombre;
    } catch (Exception e) {
        e.printStackTrace();
    }
}

应用程序正确获取 id 值并将其显示在屏幕上(“id”和“nombre”变量分别分配给 TextView),但“nombre”不起作用。

我应该改变什么?:)

感谢您的所有时间和帮助。这个网站很有帮助!

PD:我一直在整个网站上寻找回复,但没有找到任何回复。

4

2 回答 2

2

您两次使用相同的输入流,但第二次使用它时它已经在文件末尾。您必须再次打开流或将其缓冲在 a 中ByteArrayInputStream并重用它。

在你的情况下这样做:

inputSource = new InputSource(new FileInputStream(xmlDocument));

在这条线之前

XPathExpression  tag_nombre = xPath.compile("/dispositivo/nombre");

应该有帮助。

请注意,您应该正确关闭您的流。

于 2012-11-26T23:10:39.157 回答
0

问题是您不能多次重复使用流输入源 - 第一次调用tag_id.evaluate(inputSource)已经读取了输入到最后。

一种解决方案是提前解析 Document:

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
Document document = documentBuilderFactory.newDocumentBuilder().parse(inputSource);

Source source = new DOMSource(document);

// evalute xpath-expressions on the dom source
于 2012-11-26T23:12:03.870 回答