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