在android中使用DOM解析XML

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

我的xml看起来像这样

在此处输入图像描述

下面是我的代码

try { XMLParser parser = new XMLParser(); Document doc = parser.getDomElement(xml); // getting DOM element NodeList n1 = doc.getElementsByTagName("company"); // looping through all item nodes  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  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 

不应该所有显示可以任何正文帮助我如何重写我的代码

这应该这样做:

  XMLParser parser = new XMLParser(); Document doc = parser.getDomElement(xml); // getting DOM element NodeList n1 = doc.getElementsByTagName("company"); // looping through all item nodes  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")); } } } 

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

  XMLParser parser = new XMLParser(); Document doc = parser.getDomElement(xml); // getting DOM element NodeList n1 = doc.getElementsByTagName("company"); // looping through all item nodes  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 } } } 

请尝试以下代码:

 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); } } 

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

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

试试这个代码

for(int i = 0; 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]); }