有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在安卓中使用DOM解析XML

嗨,我想解析XML并根据用户选择显示列表

我的xml看起来像这样

enter image description here

下面是我的代码

      try {
            XMLParser parser = new XMLParser();
            Document doc = parser.getDomElement(xml); // getting DOM element
            NodeList n1 = doc.getElementsByTagName("company");

            // looping through all item nodes <item>
            for (int i = 0; i < n1.getLength(); i++) {
                // creating new HashMap
                Element e = (Element) n1.item(i);

                System.out.println("name node "+parser.getValue(e, "name"));
            }

通过这种方式,我得到的输出如下

  Company ABC
  Company XYZ

公司名单

但是
我会像这样写代码

        NodeList n1 = doc.getElementsByTagName("province"); 
        // looping through all item nodes <item>
            for (int i = 0; i < n1.getLength(); i++) {
                // creating new HashMap
                Element e = (Element) n1.item(i);

                System.out.println("name node "+parser.getValue(e, "name"));
            }

我正在得到一份省名清单

   Alberta
   Ontario
   New York
   Florida

但它应该是这样工作的

当我选择ABC公司时

应仅显示两个供应列表

       Alberta
       Ontario

不是所有的显示器都能帮助我重写代码


共 (5) 个答案

  1. # 1 楼答案

    对document对象调用的getElementsBytagName将始终返回整个文档中具有给定标记名的所有节点的列表。相反,过滤掉您感兴趣的单个公司元素,然后在it上调用getElementsByTagName。例如

    Element companyEl = doc.getElementById(desiredCompanyId);
    if (companyEl != null) { // always good to check
        NodeList n1 = companyEl.getElementsByTagName("province");
    
        // your code here
    }
    
  2. # 2 楼答案

    请尝试使用此代码

    对于(int i=0;i<;nodeList.getLength();i++{

            Node node = nodeList.item(i);
    
            name[i] = new TextView(this);
            website[i] = new TextView(this);
            category[i] = new TextView(this);
    
            Element fstElmnt = (Element) node;
            NodeList nameList = fstElmnt.getElementsByTagName("name");
            Element nameElement = (Element) nameList.item(0);
            nameList = nameElement.getChildNodes();
            name[i].setText("Name = "
                    + ((Node) nameList.item(0)).getNodeValue());
    
            NodeList websiteList = fstElmnt.getElementsByTagName("website");
            Element websiteElement = (Element) websiteList.item(0);
            websiteList = websiteElement.getChildNodes();
            website[i].setText("Website = "
                    + ((Node) websiteList.item(0)).getNodeValue());
    
            category[i].setText("Website Category = "
                    + websiteElement.getAttribute("category"));
    
            layout.addView(name[i]);
            layout.addView(website[i]);
            layout.addView(category[i]);
    
        }
    
  3. # 3 楼答案

    这应该做到:

            XMLParser parser = new XMLParser();
            Document doc = parser.getDomElement(xml); // getting DOM element
            NodeList n1 = doc.getElementsByTagName("company");
    
            // looping through all item nodes <item>
            for (int i = 0; i < n1.getLength(); i++) {
                Element e = (Element) n1.item(i);
                System.out.println("name node "  +parser.getValue(e, "name"));
                NodeList children = e.getChildNodes();
                for (int j = 0; j < children.getLength(); j++) {
                     Node child = children.item(j);
                     if (child.getNodeName().equalsIgnoreCase("province")) {
                          System.out.println("name node " + parser.getValue((Element)child, "name"));
                     }
                }
            }
    
  4. # 4 楼答案

    在“公司”节点上使用Node.getChildNodes()。然后,要获取子省节点,请按名称进行比较。例如:

        XMLParser parser = new XMLParser();
        Document doc = parser.getDomElement(xml); // getting DOM element
        NodeList n1 = doc.getElementsByTagName("company");
    
        // looping through all item nodes <item>
        for (int i = 0; i < n1.getLength(); i++) {
            Node companyNode = n1.item(i);
            NodeList childNodes = companyNode.getChildNodes();
            // Here we're getting child nodes inside the company node.
            // Only direct childs will be returned (name and province)  
    
            for (int j = 0; j < childNodes.getLength(); j++) {
                Node childNode = childNodes.item(j);
                if("province".equalsIgnoreCase(childNode.getName())){
                    //Do something with province
                }
            }
        }
    
  5. # 5 楼答案

    请尝试以下代码:

    public class MainActivity  extends Activity {
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        /** Create a new layout to display the view */
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(1);
    
        /** Create a new textview array to display the results */
        TextView name[];
        TextView website[];
        TextView category[];
    
        try {
    
            URL url = new URL(
                    "http://xyz.com/aa.xml");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new InputSource(url.openStream()));
            doc.getDocumentElement().normalize();
    
            NodeList nodeList = doc.getElementsByTagName("item");
    
            /** Assign textview array lenght by arraylist size */
            name = new TextView[nodeList.getLength()];
            website = new TextView[nodeList.getLength()];
            category = new TextView[nodeList.getLength()];
    
            for (int i = 0; i < nodeList.getLength(); i++) {
    
                Node node = nodeList.item(i);
    
                name[i] = new TextView(this);
                website[i] = new TextView(this);
                category[i] = new TextView(this);
    
                Element fstElmnt = (Element) node;
                NodeList nameList = fstElmnt.getElementsByTagName("name");
                Element nameElement = (Element) nameList.item(0);
                nameList = nameElement.getChildNodes();
                name[i].setText("Name = "
                        + ((Node) nameList.item(0)).getNodeValue());
    
                NodeList websiteList = fstElmnt.getElementsByTagName("website");
                Element websiteElement = (Element) websiteList.item(0);
                websiteList = websiteElement.getChildNodes();
                website[i].setText("Website = "
                        + ((Node) websiteList.item(0)).getNodeValue());
    
                category[i].setText("Website Category = "
                        + websiteElement.getAttribute("category"));
    
                layout.addView(name[i]);
                layout.addView(website[i]);
                layout.addView(category[i]);
    
            }
        } catch (Exception e) {
            System.out.println("XML Pasing Excpetion = " + e);
        }
    
        /** Set the layout view to display */
        setContentView(layout);
    
    }
    }