如何在Android中解析这个XML?

发布于 2024-10-07 21:49:15 字数 1472 浏览 5 评论 0原文

我对 XML 解析很陌生,并且我有自己的解析 XML 的方法。只有该方法适用于只有 1 个子节点的简单 XML 布局。

我现在必须解析一个包含子级的 XML 文件,该文件的子级又包含子级(明白了:)?)

这是我现在拥有的解析方法:

protected Map<String, Maatschappij> getAutopechTel() {
    Map<String, Maatschappij> telVoorAutopech = new HashMap<String, Maatschappij>();

    try {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                .newDocumentBuilder();
        Document doc = builder.parse(getAssets().open("autopech.xml"));
        NodeList nl = doc.getElementsByTagName("dienst");
        for (int i = 0; i < nl.getLength(); i++) {
            Node node = nl.item(i);
            Maatschappij maat = new Maatschappij();

            maat.setNaam(Xml.innerHtml(Xml.getChildByTagName(node, "naam")));
            maat.setTel(Xml.innerHtml(Xml.getChildByTagName(node, "tel")));

            telVoorAutopech.put(maat.getTel(), maat);
        }
    } catch (Exception e) {
    }
    return telVoorAutopech;
}

我必须如何调整它才能解析这种类型的 XML 文件:

   <Message>  

    <Service>Serviceeee</Service>

      <Owner>Bla</Owner>

      <LocationFeedTo>Too</LocationFeedTo>

      <Location>http://maps.google.com/?q=52.390001,4.890145</Location>

      <Child1>

        <Child1_1>

          <Child1_1_1>ANWB</Child1_1_1>

        </Child1_1>
      </Child1>
<Message>

I am quite new to XML parsing and I have my method of parsing XML. Only that method is for simple XML layouts with just 1 child node.

I now have to parse an XML file with childs that have childs that have childs (got it :)?)

This is the parse-method I have now:

protected Map<String, Maatschappij> getAutopechTel() {
    Map<String, Maatschappij> telVoorAutopech = new HashMap<String, Maatschappij>();

    try {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                .newDocumentBuilder();
        Document doc = builder.parse(getAssets().open("autopech.xml"));
        NodeList nl = doc.getElementsByTagName("dienst");
        for (int i = 0; i < nl.getLength(); i++) {
            Node node = nl.item(i);
            Maatschappij maat = new Maatschappij();

            maat.setNaam(Xml.innerHtml(Xml.getChildByTagName(node, "naam")));
            maat.setTel(Xml.innerHtml(Xml.getChildByTagName(node, "tel")));

            telVoorAutopech.put(maat.getTel(), maat);
        }
    } catch (Exception e) {
    }
    return telVoorAutopech;
}

How must I adjust this in order to parse this type of XML file:

   <Message>  

    <Service>Serviceeee</Service>

      <Owner>Bla</Owner>

      <LocationFeedTo>Too</LocationFeedTo>

      <Location>http://maps.google.com/?q=52.390001,4.890145</Location>

      <Child1>

        <Child1_1>

          <Child1_1_1>ANWB</Child1_1_1>

        </Child1_1>
      </Child1>
<Message>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

别低头,皇冠会掉 2024-10-14 21:49:15

您可以使用 SAXParser在Android中解析XML:

这里有详细的教程示例还有 IBMdeveloperWorks 的另一个示例

DOM 解析器速度慢且消耗大量
加载 XML 文档时的内存
其中包含大量数据。请
考虑 SAX 解析器作为解决方案
它,SAX比DOM更快并且使用
内存较少。

尝试一下这个,但我还没有测试过这段代码。它递归地遍历所有节点并将 ELEMENT_NODE 添加到 Vector 中。

public void traverseNodes(Node node, Vector<Node> nodeList)
{
    if(node.getNodeType() == Node.ELEMENT_NODE)
    {
        nodeList.add(node);
        if(node.getChildNodes().getLength() >= 1)
        {
            NodeList childNodeList = node.getChildNodes();
            for(int nodeIndex = 1;nodeIndex < childNodeList.getLength(); nodeIndex++)
            {
                traverseNodes(childNodeList.item(nodeIndex),nodeList);
            }
        }
    }

}

You can use SAXParser to parse XML in Android :

Here is a detailed tutorial with example and also another one here by IBM developerWorks.

DOM Parser is slow and consume a lot
memory if it load a XML document
which contains a lot of data. Please
consider SAX parser as solution for
it, SAX is faster than DOM and use
less memory.

Try this one out but I haven't tested this code yet. It recursively traverses all the nodes and adds which are ELEMENT_NODE to the Vector<Node>.

public void traverseNodes(Node node, Vector<Node> nodeList)
{
    if(node.getNodeType() == Node.ELEMENT_NODE)
    {
        nodeList.add(node);
        if(node.getChildNodes().getLength() >= 1)
        {
            NodeList childNodeList = node.getChildNodes();
            for(int nodeIndex = 1;nodeIndex < childNodeList.getLength(); nodeIndex++)
            {
                traverseNodes(childNodeList.item(nodeIndex),nodeList);
            }
        }
    }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文